Frage zu Klassen.
-
Hi,
Ich versuche schon paar stunden mich in Klassen einzuarbeiten, aber es klappt einfach nicht. Ich habe 2 Klassen, Klasse "AB" und Klasse "CD". Ich möchte zugriff auf die member von AB über CD haben, und dasselbe für CD über AB. Hier der test code:
#include <iostream> class CD; class AB { private: CD test2; // error C2079: 'AB::test2' uses undefined class 'CD' public: friend class CD; void CallFromCD() { std::cout << "Hi from CallAB\n"; } void CallCD() { //test2.CallFromAB(); } }; class CD { private: AB test1; public: friend class AB; void CallAB() { test1.CallFromCD(); } void CallFromAB() { std::cout << "Hi from AB" << "\n"; } }; int main() { CD MyVar; MyVar.CallAB(); }Wieso kann ich die Fkt von AB aus CD Rufen, aber nicht andersherum?
Grüße
-
Wenn die Klasse
ABeinCD-Objekt enthält undCDwiederum einAB, wo soll das dann aufhören?Wieso müssen sich die beiden Klassen aggregieren? Das ist ein fragwürdiger Ansatz. Zeiger helfen hier schon eher.
-
Beginner123 schrieb:
class CD; class AB { private: CD test2; // error C2079: 'AB::test2' uses undefined class 'CD' // .... }; class CD { private: AB test1; // ... };Ein AB hat also ein CD als Mitglied, welches ein AB als Mitglied hat, welches ein CD als Mitglied hat, welches ain AB u.s.w. Deine Objekte wären also unendlich groß.
Der Compiler meckert, weil Du eine Klasse AB mit einem Element eines nicht-vollständigen Typs CD definierst. Denn wir wissen noch nicht, was was und wie groß CD ist. Der Compiler kann sich dann auch kein Layout für Objekte der Klasse AB überlegen. Deswegen sind nicht-vollständige Typen als Elemente einer Klasse nicht erlaubt.
Du kannst aber stattdessen (wenn es unbedingt sein muss) einen Zeiger als Element benutzen. Zeiger auf unvollständige Typen sind in Ordnung. Das ist dann aber mit Vorsicht zu genießen.
Gruß,
SP