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


von Sebastian (Gast)


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
1
#ifndef test_h
2
#define test_h
3
4
#include "WProgram.h"
5
6
class apfel
7
{
8
  public:
9
    apfel(int pin);
10
    void kuchen();
11
  private:
12
    int _pin;
13
};
14
15
class birne
16
{
17
  public:
18
    birne(int pin);
19
    void essen();
20
  private:
21
    int _pin;
22
};
23
24
#endif

Datei test.cpp
1
#include "WProgram.h"
2
#include "test.h"
3
4
apfel::apfel(int pin)
5
{
6
  pinMode(pin, OUTPUT);
7
  _pin = pin;
8
}
9
10
void apfel::kuchen()
11
{
12
  for (int i=0;1<2;i++){
13
    digitalWrite(_pin, HIGH);
14
    delay(1111);
15
    digitalWrite(_pin, LOW);
16
  }
17
}
18
19
//----------------------------
20
21
birne::birne(int pin)
22
{
23
  pinMode(pin, OUTPUT);
24
  _pin = pin;
25
}
26
27
void birne::essen()
28
{
29
  for (int i=0;1<3;i++){
30
    digitalWrite(_pin, HIGH);
31
    delay(1111);
32
    digitalWrite(_pin, LOW);
33
  }
34
}

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.
1
void blink(int pin, int anzahl){
2
  for (int i=0;1<anzahl;i++){
3
    digitalWrite(pin, HIGH);
4
    delay(1111);
5
    digitalWrite(pin, LOW);
6
  }
7
}

Womit die gesamte test.cpp folgendermaßen aussähe
1
#include "WProgram.h"
2
#include "test.h"
3
4
apfel::apfel(int pin)
5
{
6
  pinMode(pin, OUTPUT);
7
  _pin = pin;
8
}
9
10
void apfel::kuchen()
11
{
12
  blink(_pin,2);
13
}
14
15
//----------------------------
16
17
birne::birne(int pin)
18
{
19
  pinMode(pin, OUTPUT);
20
  _pin = pin;
21
}
22
23
void birne::essen()
24
{
25
  blink(_pin,3);
26
} 
27
28
//----------------------------
29
30
void blink(int pin, int anzahl){
31
  for (int i=0;1<anzahl;i++){
32
    digitalWrite(pin, HIGH);
33
    delay(1111);
34
    digitalWrite(pin, LOW);
35
  }
36
}

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

von Michael K. (michaelkorb)


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.

von Klaus W. (mfgkw)


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++.

von Sebastian (Gast)


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

von Sebastian S. (stundenblume)


Lesenswert?

Hallo Klaus,

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


Sebastian

von Klaus W. (mfgkw)


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

von Klaus W. (mfgkw)


Angehängte Dateien:

Lesenswert?

Klaus Wachtler schrieb:
> Wahrscheinlich sinnvoller ist es aber, eine Basisklasse Obst zu
> machen, und davon Apfel und Birne abzuleiten.
1
klaus@i4a:~ > g++ -Wall fallobst.cpp && ./a.out
2
Tell sagt:
3
Blink!
4
Blink!
5
Kohl sagt:
6
Blink!
7
Blink!
8
Blink!

von Sebastian S. (stundenblume)


Lesenswert?

Phoa, Danke Klaus!

Das werde ich mir zuhause mal ansehen & versuchen durzusteigen.


Sebastian

von Klaus W. (mfgkw)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.