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
classapfel
7
{
8
public:
9
apfel(intpin);
10
voidkuchen();
11
private:
12
int_pin;
13
};
14
15
classbirne
16
{
17
public:
18
birne(intpin);
19
voidessen();
20
private:
21
int_pin;
22
};
23
24
#endif
Datei test.cpp
1
#include"WProgram.h"
2
#include"test.h"
3
4
apfel::apfel(intpin)
5
{
6
pinMode(pin,OUTPUT);
7
_pin=pin;
8
}
9
10
voidapfel::kuchen()
11
{
12
for(inti=0;1<2;i++){
13
digitalWrite(_pin,HIGH);
14
delay(1111);
15
digitalWrite(_pin,LOW);
16
}
17
}
18
19
//----------------------------
20
21
birne::birne(intpin)
22
{
23
pinMode(pin,OUTPUT);
24
_pin=pin;
25
}
26
27
voidbirne::essen()
28
{
29
for(inti=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
voidblink(intpin,intanzahl){
2
for(inti=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(intpin)
5
{
6
pinMode(pin,OUTPUT);
7
_pin=pin;
8
}
9
10
voidapfel::kuchen()
11
{
12
blink(_pin,2);
13
}
14
15
//----------------------------
16
17
birne::birne(intpin)
18
{
19
pinMode(pin,OUTPUT);
20
_pin=pin;
21
}
22
23
voidbirne::essen()
24
{
25
blink(_pin,3);
26
}
27
28
//----------------------------
29
30
voidblink(intpin,intanzahl){
31
for(inti=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
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.
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++.
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
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