protected-Elemente in abgeleitet Klasse nicht deklariert? oO [templ.Klasse]
-
Hi,
sorry, ich bin gerade etwas n00bish und nerve wahrscheinlich schon mit meinen Fragen, danke für die hier investierte Zeit schon Mal im Voraus.
Ich habe eine Vererbung...
template<class T> class Base { protected: T* var_; }; template<class T> class Node : public Base<T> { public: Node(); }; template<class T> Node<T>::Node() { *var_ = 0/* irgendwas*/; }in *var_ meldet er mir: var_ undeclared (first use this function)...
mit this-> davor funktioniert's allerdings.
Liegt das daran, dass der Base-ctor seine Variable initialisieren möchte und dass nicht die abgeleitete Klasse machen soll? Das würde heißen, dass es in einer gewöhnlichen Methode von Node keine derartigen Probleme gäbe.
Aber wenn dem so ist...
Wie soll ich dann eine Situation darstellen, in der zwei Klassen die gleichen Attribute (und teilweise dafür geschriebene Methoden) besitzen, aber halt unterschiedliche ctor dafür nutzen?
Die Lösung wäre natürlich darin gegeben, dass ich entsprechende set- und get-Methoden für die Attribute schreibe und die Attribute dann in den private-Bereich von Base einordne... Würde natürlich der Theorie zusagen, die meint, dass protected-Attribute unschöner Stil sind...MfG Eisflamme

-
das funktioniert hier nicht, weil klassen templates als basis beim unqualifizierten aufruf nicht durchsucht werden (können). schließlich könnte das basistemplate ja spezialisierungen enthalten, die den bezeichner haben und andere, die ihn nicht haben. ohne T zu kennen, kann der compiler das nicht entscheiden. hier wird ein qualifizierter aufruf oder ein aufruf über this benötigt.
template<class T> Node<T>::Node() { *Base<T>::var_ = 0; // oder this->var_ = 0; }
-
Mis2com schrieb:
Hi,
sorry, ich bin gerade etwas n00bish und nerve wahrscheinlich schon mit meinen Fragen, danke für die hier investierte Zeit schon Mal im Voraus.
Ich habe eine Vererbung...
template<class T> class Base { protected: T* var_; }; template<class T> class Node : public Base<T> { public: Node(); }; template<class T> Node<T>::Node() { *var_ = 0/* irgendwas*/; }in *var_ meldet er mir: var_ undeclared (first use this function)...
Das liegt daran, dass var_ in dem Namensbereich von Base<T> liegt (edit: siehe camper). Also musst du es davor schreiben:
template<class T> Node<T>::Node() { *Base<T>::var_ = 0/* irgendwas*/; }oder du benutzt using:
template<class T> class Node : public Base<T> { public: using Base<T>::var_; Node(); };mfg.
-
Hi,
okay, so viel zur Lösung, danke.

Ich muss aber zugeben, ich hab' noch nicht verstanden, was genau das Problem ist.
Wenn in der entsprechenden Template-Klasse ein Attribut besteht, wieso ist es dann nötig zu wissen, welchen Typ das hat? T beeinflusst ja nicht die Klassenhirarchie. Das einzige, was undefiniert ist, ist doch, ob z.B. operator= definiert ist oder so, aber das ist nicht das Problem, oder?Danke schon Mal !!
MfG Eisflamme
-
Mis2com schrieb:
Wenn in der entsprechenden Template-Klasse ein Attribut besteht,
genau das ist das steht ja eben nicht fest. das kann der compiler nicht wissen. bloß weil ein attribut im primärtemplate existiert, muss das nicht für eine spezialisierung gelten. und ohne kenntnis von T wissen wir nicht, ob eben diese spezialisierung oder aber das primärtemplate ausgewählt wird.
-
Hi,
hm...
wenn T Attribut ist, durch welche Spezialisierung der Klasse mit einem bestimmten T kann man denn das Attribut dann ausschalten? oO
Sorry, ich steig gerade net ganz durch. ^^edit:
Achso, es lassen sich ja auch Spezialisierungen der Templateklassen definieren und net nur instanzieren (<- jetzt bin ich unsicher, ob die beiden Verben richtig angewendet wurden...) anfertigen, hab ich missachtet. Betrachtet es das für diesen Fall?
Primärtemplate = Unspezialisierte Templateklasse?
Und wieso ist durch this-> dann klar, dass das Attribut besteht? Ist doch genau so ungewiss?MfG Eisflamme
-
ok, simples beispiel:
template<typename T> struct Base { T attribute; virtuel ~Base() {} }; template<typename T> struct Derived : Base<T> { Derived() { Base<T>::attribute = T(); } }; template<typename T> struct Base<T*> { virtual ~Base() {} }; Derived<int> foo; // ok Derived<void*> bar; // bumm, Base<void*> hat gar kein attribute, also kann der derived default konstruktor nicht instantiiert werden
-
Hi,
ok, danke, das verdeutlicht die Angelegenheit doch erheblich.

Aber ein this-> macht für mich dennoch keinen Sinn:
Wenn man so argumentiert, dass die Klasse das Attribut nicht zwangsläufig haben kann, dann macht this-> auch keinen Sinn, zeigt this doch auf das eigene Objekt...Kann sein, dass ich gerade Erbsen zähle, bin aber auch nicht sicher, ob ich da ganz auf der Glasbrücke laufe.
Danke jedenfalls für die Hilfe

ich geh jetzt schlafen, wünsche eine gute Nacht!MfG Eisflamme