Klassen, die sich gegenseitig Referenzieren
-
Hallo,
ich habe das Problem, dass ich zwei Klassen habe (zB A und B), die als Membervariable jeweils einen Pointer auf die andere Klasse haben (also A hat B* classB und B hat A* classA). Die beiden Klassen refernzieren sich also Gegenseitig. Die beiden Klassen sind in verschiedenen .h-Dateien und sind gegen mehrfaches "inkludieren" abgesichert. So weit so gut.
Allerding ist jetzt beim kompilieren das Problem, dass egal welche Klasse zuerst gebaut wird die andere ja noch nicht bekannt ist. Ich habe dann als erste Lösung in den A-Header
class B;
eingefügt, was auch so lange funktioniert, so lange A keine member(funktionen) von B aufruft.Wie bekomme ich die beiden Klassen dazu, dass sie auch die Memberfunktionen gegenseitig aufrufen können??
Grüße ChessenhomerPS: Fells irgendwo Tippfehler drin sind, so liegt dass daran ich gerade alles mit links mache, weil mein rechtes handgelenk gebrochen ist....
-
Daten folgen einer Hierachie. Wenn die Klasse A als Member auf B referiert, wuerde es der Logik wiedersprichen, dass B auf refierert per Pointer. Wenn beide Klassen geimeinsan referiert werden sollen, dann solltest Du eine Class C bauen:
class C { A *pA_Class; B *pB_Class;
Damit kannst beide Klassen miteinander reden lassen.
-
Du kannst allerdings auch einfach die jeweils benötigte Klasse im Header der anderen bekannt machen:
class B; // jetzt weiß der Compiler, dass es Klasse B gibt und dass die Definition irgendwo später erfolgt. class A : public... { // was auch immer }
Das nennt sich dann Forward Declaration.
-
forward declaration ist die lösung
file "A.h"class B; class A { protected: B * b; // funktioniert da die grösse eines pointers bekannt ist B bo; // geht nicht da der compiler zwar weiss dass es B gibt aber // nicht wie gross B ist. };
file "B.h"
class A; class B { protected: A * a; };
Kurt
-
Hallo nochmal,
Danke für die Antworten. Es ist bei mir also ein design-Fehler.
Forward-Deklaration funktioniert wie ZuK gesagt hat nur mit Pointern. Wenn ich aber auf die Member zugreifen möchte geht das nicht, da ja die Adressen der Member zur kompile-Zeit noch nicht bekannt sind.
-
Cheesenhomer schrieb:
Hallo nochmal,
Danke für die Antworten. Es ist bei mir also ein design-Fehler.
Forward-Deklaration funktioniert wie ZuK gesagt hat nur mit Pointern. Wenn ich aber auf die Member zugreifen möchte geht das nicht, da ja die Adressen der Member zur kompile-Zeit noch nicht bekannt sind.Du kannst die methoden der forward declarierten klasse nur aus dem Headerfile heraus nicht aufrufen. Im .cpp geht das schon da du dort beide Header einbindest und und dann beide Klassen bekannt sind.
Kurt
-
Du kannst zur laufzeit auch über einen Pointer auf ein Objekt zugreifen.
Du musst nur die Gültigkeit des Pointers sicherstellen.
-
Cheesenhomer schrieb:
Es ist bei mir also ein design-Fehler.
Nein, bidirektionale Assoziationen sind nicht gerade selten.
-
Bashar schrieb:
Nein, bidirektionale Assoziationen sind nicht gerade selten.
cool. Suche schon länger nach einer Bezeichnung dafür.
( vielleicht sollte ich auch einmal ein Buch über C++ lesen. )
Kurt