Forward declaration geht nicht
-
Ich habe hier 2 Klassen; A und B, die sich gegenseitig verwenden können sollen.
class B; class A { friend class B; private: B *_pB; public: A() { } void SetB(B *pB) { this->_pB->SetNull(); this->_pB = pB; } void SetNull() { this->_pB = NULL; } }; class B { friend class A; private: A *_pA; public: B() { } void SetA(A *pA) { this->_pA->SetNull(); this->_pA = pA; } void SetNull() { this->_pA = NULL; } };Probleme gibt es aber mit den Zeilen 14 und 34.
Warum kann ich von der jeweils anderen Klasse keine Methoden benutzen?
-
dddaaa schrieb:
Probleme gibt es aber mit den Zeilen 14 und 34.
Ist das eigentlich so schwer zu begreifen, dass das keine ausreichende Problembeschreibung ist?
-
dddaaa schrieb:
Warum kann ich von der jeweils anderen Klasse keine Methoden benutzen?
Weil eine Forward Declaration dafür nicht ausreicht. Um eine Methode aufzurufen, muss diese zuerst auch mal deklariert sein. D.h.: Du brauchst die vollständige Definition der Klasse. Lösung: Methode außerhalb der Klassendefinition definieren...
-
dddaaa schrieb:
Ich habe hier 2 Klassen; A und B, die sich gegenseitig verwenden können sollen.
Hui, ist das einfach. Beide vorwärtsdeklarieren, dann beide definieren und danach für beide die Member-Funktionen definieren. In den Funktionsdefinitionen können beide Klassen dann normal genutzt werden.
Also
class A; class B; class A { friend class B; private: B *_pB; public: A(); void SetB(B *pB); void SetNull(); }; class B { friend class A; private: A *_pA; public: B(); void SetA(A *pA); void SetNull(); }; A::A() { } void A::SetB(B *pB) { _pB->SetNull(); _pB = pB; } void A::SetNull() { _pB = NULL; } B::B() { } void B::SetA(A *pA) { _pA->SetNull(); _pA = pA; } void B::SetNull() { _pA = NULL; }Ungetestet (keine Garantie gegen Flüchtigkeitsfehler
)
this->hab ich mal weggenommen. Sieht dann weniger kryptisch aus.
Formatierung ist übrigens auch nicht die hübscheste...
-
Cool funktioniert danke, wieder was gelernt!
-
Und wie mach ich das, wenn ich eine Klasse in jeweils einer Header Datei haben möchte?
Also z.B. habe ich:
a.h
#ifndef A_H #define A_H #include "b.h" class A { private: B *_pB; public: A(); void SetB(B *pB); void SetNull(); }; A::A() { } void A::SetB(B *pB) { _pB->SetNull(); _pB = pB; } void A::SetNull() { _pB = NULL; } B::B() { } #endifund b.h
#ifndef B_H #define B_H #include "a.h" class B { private: A *_pA; public: B(); void SetA(A *pA); void SetNull(); }; B::B() { } void B::SetA(A *pA) { _pA->SetNull(); _pA = pA; } void B::SetNull() { _pA = NULL; } #endifDann kommt es wieder zum alten Problem.
Es sei denn, ich erstelle noch eine 3. Header Datei: ab.h#ifndef AB_H #define AB_H #include "a.h" #include "b.h" A::A() { } void A::SetB(B *pB) { _pB->SetNull(); _pB = pB; } void A::SetNull() { _pB = NULL; } B::B() { } void B::SetA(A *pA) { _pA->SetNull(); _pA = pA; } void B::SetNull() { _pA = NULL; } #endifIn dieser sind nun die Methoden der Klassen A und B enthalten und das Programm läuft.
Ginge das denn auch ohne ab.h?
-
Schon mal was von Header&Source gehört? Ist 'ne ganz tolle Sache.