frage zur forward-deklaration
-
hi,
ich glaub mir fehlt grad ne gehirnwindung... wieso funktioniert folgendes nicht? ich habe doch extra ne forward-deklaration gemacht um A in B bekannt zu machen. wieso bekomme ich dann als fehler das A undefiniert ist?
class C { }; class A; class B { public: B& operator = (const C &rhs) { A a; a(rhs, *this); return *this; } }; class A { public: void operator () (const C &lhs, B &rhs) { } };folgendes dagegen funktioniert natürlich, da der operator erst nach der klasse a implementiert wird:
class C { }; class B { public: B& operator = (const C &rhs); }; class A { public: void operator () (const C &lhs, B &rhs) { } }; B& B::operator = (const C &rhs) { A a; a(rhs, *this); return *this; }danke
-
Forward-Deklarationen kannst du nur verwenden, wenn die Größe (und der Aufbau) der Typen keine Rolle spielt - sprich: bei Pointern oder Referenzen. A::operator() benötigt nur das Wissen, daß es eine Klasse "B" gibt, B::operator= benötigt dagegen den Aufbau der Klasse "A", um compiliert zu werden.
-
allso ich kann es nicht mit sicherheit sagen, da ich mich eigentlich als Laie bezeichne, aber für mich sieht es wie folgt aus:
Dein Zeiger rhs ist vom Typ B, der ist dem Compiler zu dem Zeitpunkt allerdings noch nicht bekannt, da erst später die Klasse B aufgerufen wird.
Bitte korregieren falls ich einen Mist erzähle!
-
*LittleT korrigiert* rhs ist vom Typ "const C&" (das ist der Parameter der Funktion) - Probleme bekommt die Forward-Deklaration mit den Anweisungen "A a;" (benötigt die Größe eines A-Objektes) und "a(rhs,*this);" (benötigt die Signatur des A::operator()) - diese beiden Angaben erfährt der Compiler erst viel später (nämlich wenn er die Definition von class A liest).
-
danke, ist mir jetzt einiges klarer...