www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mehrere Klassen einer Library sollen gemeinsame Funktion nutzen


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte von unterschiedlichen Klassen einer Library auf eine 
gemeinsame Funktion zugreifen.
Folgend mal an einem Beispiel erläutert.

Datei Test.h
#ifndef test_h
#define test_h

#include "WProgram.h"

class apfel
{
  public:
    apfel(int pin);
    void kuchen();
  private:
    int _pin;
};

class birne
{
  public:
    birne(int pin);
    void essen();
  private:
    int _pin;
};

#endif

Datei test.cpp
#include "WProgram.h"
#include "test.h"

apfel::apfel(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void apfel::kuchen()
{
  for (int i=0;1<2;i++){
    digitalWrite(_pin, HIGH);
    delay(1111);
    digitalWrite(_pin, LOW);
  }
}

//----------------------------

birne::birne(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void birne::essen()
{
  for (int i=0;1<3;i++){
    digitalWrite(_pin, HIGH);
    delay(1111);
    digitalWrite(_pin, LOW);
  }
} 

void apfel::kuchen und void birne::essen führen die gleiche Aktion 
unterschiedlich häufig aus. Es wäre ja schöner beide die folgende 
Funktion aufrufen zu lassen.
void blink(int pin, int anzahl){
  for (int i=0;1<anzahl;i++){
    digitalWrite(pin, HIGH);
    delay(1111);
    digitalWrite(pin, LOW);
  }
} 

Womit die gesamte test.cpp folgendermaßen aussähe
#include "WProgram.h"
#include "test.h"

apfel::apfel(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void apfel::kuchen()
{
  blink(_pin,2);
}

//----------------------------

birne::birne(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void birne::essen()
{
  blink(_pin,3);
} 

//----------------------------

void blink(int pin, int anzahl){
  for (int i=0;1<anzahl;i++){
    digitalWrite(pin, HIGH);
    delay(1111);
    digitalWrite(pin, LOW);
  }
} 

Das kann so aber nicht kompiliert werden. Hat da jemand vielleicht einen 
Tip für mich, wie ich es schaffe eine gemeinsame Funktion aus 
unterschiedlichen Klassen zu nutzen?


Danke im voraus & Gruß,

Sebastian

Autor: Michael Korb (michaelkorb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau sagt denn der Compiler?

Ich vermute, er kann die Funktion blink nicht finden, da sie auch nicht 
deklariert ist. EIgentlich ist es kein Problem globale Funktionen in 
Klassen zu verwenden. Deklarier sie entweder im header-file oder schreib 
sie an den Anfang der Quelle.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum einen wie gesagt eine globale Funktion nutzen, die vor
der Benutzung deklariert sein muß.

Wahrscheinlich sinnvoller ist es aber, eine Basisklasse Obst zu
machen, und davon Apfel und Birne abzuleiten.
Das Blinken kann in die Basisklasse, die Anzahl (da
unterschiedlich) wird im ctor von Apfel und Birne unterschiedlich
gesetzt (2 bzw. 3).

Das es kein Obst geben wird, das nicht einer bestimmten Sorte
angehört, wird Obst typischerweise eine abstrakte Baisklasse
(ABC = abstract base class) sein, dh. mindestens Methode
darin nicht definiert und zu 0 gesetzt (pure virtual).

Wenn schon C++, dann C++.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Michael,

er konnte die Funktion nicht finden. Wenn ich sie am Anfang direkt 
einführe funktioniert alles tadellos. Danke!

Noch zwei ergänzende Fragen.
1. Wenn ich eine der beiden Klassen in meinem Code nicht verwende, 
belastet dann die ungenutzte Klasse meinen Speicher? Also wird sie mit 
compiliert?
2. Ich verwende die Arduino Umgebung. Dort kann ich eine Funktion auch 
an das Ende meines Codes schreiben. Liegt das an der Umgebung(Arduino) 
oder weil es das Hauptprogramm ist?


Gruß

Sebastian

Autor: Sebastian S. (stundenblume)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,

ich werde mal sehen ob ich das umgesetzt bekomme. Wenn nicht, melde ich 
mich wieder.


Sebastian

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Hi Michael,
>
> er konnte die Funktion nicht finden. Wenn ich sie am Anfang direkt
> einführe funktioniert alles tadellos. Danke!

Die ganze Definition nach oben schieben ist ein Weg, der andere wäre,
die funktion zu lassen wo sie ist und oben nur zu deklarieren.

>
> Noch zwei ergänzende Fragen.
> 1. Wenn ich eine der beiden Klassen in meinem Code nicht verwende,
> belastet dann die ungenutzte Klasse meinen Speicher? Also wird sie mit
> compiliert?

Methoden, die ungenutzt nicht belasten sollen, schreibt man
als inline (entweder explizit, oder indem man sie gleich innerhalb
der class definiert).

> 2. Ich verwende die Arduino Umgebung. Dort kann ich eine Funktion auch
> an das Ende meines Codes schreiben. Liegt das an der Umgebung(Arduino)
> oder weil es das Hauptprogramm ist?

Das ist doch auch gcc, oder?
Dann gelten für den die gleichen Regeln wie für jeden anderen
C++-Compiler.

>
>
> Gruß
>
> Sebastian

Autor: Klaus Wachtler (mfgkw)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Wahrscheinlich sinnvoller ist es aber, eine Basisklasse Obst zu
> machen, und davon Apfel und Birne abzuleiten.
klaus@i4a:~ > g++ -Wall fallobst.cpp && ./a.out
Tell sagt:
Blink!
Blink!
Kohl sagt:
Blink!
Blink!
Blink!

Autor: Sebastian S. (stundenblume)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phoa, Danke Klaus!

Das werde ich mir zuhause mal ansehen & versuchen durzusteigen.


Sebastian

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: in Apfel.h und Birne.h gehört in operator= jeweils die Zeile:
    nBlinken = rechteSeite.nBlinken;
weg.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.