Vererbung statischer Datenelemente
-
Hallo,
wahrscheinlich eine ganz dumme Frage aber ich stehe gerade auf dem Schlauch und komm nicht drauf: Wie vererbt man statische Datenelemente? Mein Problem ist, dass ein statisches Datenelement nicht virtual sein kann.#include <iostream> using namespace std; class Auto{ public: static int AnzahlPS; static void showPS(){ cout << AnzahlPS << endl; } }; class AudiA4: public Auto{ }; int AudiA4::AnzahlPS(105); class FerrariF40: public Auto{ }; int FerrariF40::AnzahlPS(450); int main(){ AudiA4::showPS(); FerrariF40::showPS(); }Fehler:
test.cc:16: error: ISO C++ does not permit 'Auto::AnzahlPS' to be defined as 'AudiA4::AnzahlPS' test.cc:20: error: ISO C++ does not permit 'Auto::AnzahlPS' to be defined as 'FerrariF40::AnzahlPS' test.cc:20: error: redefinition of 'int Auto::AnzahlPS' test.cc:16: error: 'int Auto::AnzahlPS' previously defined here
-
Wie vererbt man statische Datenelemente?
So wie du das hier darstellst, ist AnzahlPS nicht statisch. Sie aendert sich ja von Autotyp zu Autotyp.
-
knivil schrieb:
Wie vererbt man statische Datenelemente?
So wie du das hier darstellst, ist AnzahlPS nicht statisch. Sie aendert sich ja von Autotyp zu Autotyp.
Ja, aber für jeden Typ ist der Wert statisch. Oder anders gefragt: Kann ich in den abgeleiteten Klassen statische Daten haben und in der Basisklasse eine Funktion, die diese Daten verwendet? Das Autobeispiel trifft das glaube ich schon recht gut.
-
Dein Design ist etwas problematisch: Woher soll die Klasse denn wissen, ab wann ein von ihr vererbtes Element statisch ist? Wie ja bereits gesagt wurde, ist es bei der Auto-Klasse noch nicht statisch. Oder was ist, wenn du eine weitere Vererbungsebene einführst, etwa einen AudiA4Turbo?
Vielleicht ist dir mit einem anderen Designansatz geholfen, hier ein möglicher Vorschlag:
template<class T> class AnzahlPS{ public: static int anzahl; static void show(){cout<< anzahl <<endl;} }; class Auto{ }; class AudiA4: public Auto{ }; class FerrariF40: public Auto{ }; template<> int AnzahlPS<AudiA4>::anzahl=105; template<> int AnzahlPS<FerrariF40>::anzahl=450; int main(){ AnzahlPS<AudiA4>().show(); AnzahlPS<FerrariF40>().show(); }
-
Karl R schrieb:
knivil schrieb:
Wie vererbt man statische Datenelemente?
So wie du das hier darstellst, ist AnzahlPS nicht statisch. Sie aendert sich ja von Autotyp zu Autotyp.
Ja, aber für jeden Typ ist der Wert statisch. Oder anders gefragt: Kann ich in den abgeleiteten Klassen statische Daten haben und in der Basisklasse eine Funktion, die diese Daten verwendet? Das Autobeispiel trifft das glaube ich schon recht gut.
Nein. Jedenfalls nicht, wenn die betreffende Funktion nicht virtuell ist. Auch der Vorschlag von SeppJ beantwortet ja deine Frage nicht, da anzahl nun in einer Klasse ganz außerhalb der Auto-Hierarchie steht.
Warum nicht etwas in der Art:
class Auto { public: void show() { cout << anzahlPS() << std::endl; } virtual unsigned anzahlPS() const = 0; }; class Audi { public: virtual unsigned anzahlPS() const { return 105; } }; class Ente { public: virtual unsigned anzahlPS() const { return 26; } }; int main() { Audi().show(); Ente().show(); return 0; };Stefan.
-
DStefan schrieb:
Nein. Jedenfalls nicht, wenn die betreffende Funktion nicht virtuell ist. Auch der Vorschlag von SeppJ beantwortet ja deine Frage nicht, da anzahl nun in einer Klasse ganz außerhalb der Auto-Hierarchie steht.
Warum nicht etwas in der Art:
[...]
Genau das ist es.
*Mit der Hand vor den Kopf schlag*
Ich wusste doch, dass das die Frage dumm war, da hätte ich mit wenig Nachdenken auch drauf kommen können. Und bei Bedarf kann ich dann in den Klassen die wirklich eine statische PS-Zahl haben, eine statische Veriable einführen die dann von anzahlPS() zurückgegeben wird. Auf die Weise kann man die PS Zahl zum Beispiel aus einer Datei lesen, ohne sie hart im Code zu haben.