Klasse A ist memebr von KLasse B und Klasse B ist Member von Klasse A. Wie Compiliern?
-
Ich hab folgendes problem:
#include B.h class A{ aLsit<B> } #include B.h class B{ B(A* a){} }kann er nicht compilieren. leuchtet mir ja auch ein, da er weder die eine klasse ohne die andere zu bauen , noch die ander onhne die jeweils andere. die klassen brauchen sich quasi gegenseitig um sich zu erstellen. die frage ist, wie lös ich sowas?
der error des compilers ist, das er an der B constructor stelle sagt das er den typ A vom *a nicht kennt (ist natürlich per include eingebunden, kann ja aber ohne die definition von B nicht gebaut werden)
vielecith überseh ich ja etwas.
ich komm von java, da wär das no problem meine ich zu errinern.
ich danke im vorraus
D3CK
//Edit: Bitt Codetags benutzen! In Zukunft bitte daran denken! (evilissimo)
-
Versuch's mal mit einer Forward-Deklaration (für den B-Ctor braucht der Compiler nicht die volle Definition, sondern nur das Wissen, daß es eine Klasse A gibt).
-
class A; class B{ B(A* a){} } class A{ aLsit<B> }
-
boohaa! das ging ja übertrieben schnell!

nächste mal nehm ich code
ich wuste zwar erst nicht was forward-deklarationen sin, ist mir aber gelich klar geworden was gemint ist und was ich tun kann!
vielen herzlichen Dank!!

D3CK
-
und Mitglied

bis dann!
-
was ist wenn A und B im konstruktor jewils den anderen brauchen?
dann geht das nich mehr so einfach oder?
class A{ A(B *b){...} }; class B{ B(A *a) {..} };dann müsste man ja das über gegensetige gekapselte Header machen oder?
wie macht der compiler das.. er kann dies ohne das nicht machen, und das nich ohne dies?
-
Solange nur der Zeiger gebraucht wird und nicht das Objekt selbst, genügen auch hier Forward-Deklarationen. Den Körper des Konstruktors muss man allerdings, wenn der Zeiger dort dereferenziert werden soll, aus der Klasse rausziehen und nach der Includierung des Headers der jew. anderen Klasse implementieren...
// A.h class B; class A { A( B* ptr ); }; // B.h class A; class B { B( A* ptr ); }; // A.cpp #include "A.h" #include "B.h" A::A( B* ptr ) { // machwas mit *ptr } // B.cpp analog
-
Die Frage ist nur wie man ein A anlegen will wenn man ein B dazu braucht was man wiederum nur anlegen kann wenn man schon ein A hat...
-
hustbaer schrieb:
Die Frage ist nur wie man ein A anlegen will wenn man ein B dazu braucht was man wiederum nur anlegen kann wenn man schon ein A hat...
Die Verbindung muss ja nicht besitzend sein.
Beispiel:
Eine Gruppe besitzt X Mitglieder. Und jedes Mitglied weiss zu welcher Gruppe es gehört.Oder aber:
Mein Vater besitzt eine Familie (er ist quasi das oberhaupt oder was auch immer). In dieser Familie gibt es einen Sohn der selber Vater ist und eine Familie besitzt.Gibt durchaus so abstruse szenarien wo man soetwas braucht. dass sich nicht 2 objekte gegenseitig besitzen können ist klar - aber es geht hier ja nicht um objekte sondern klassen.
-
hustbaer schrieb:
Die Frage ist nur wie man ein A anlegen will wenn man ein B dazu braucht was man wiederum nur anlegen kann wenn man schon ein A hat...
ne andere sprache als c++ verwenden

-
thordk schrieb:
hustbaer schrieb:
Die Frage ist nur wie man ein A anlegen will wenn man ein B dazu braucht was man wiederum nur anlegen kann wenn man schon ein A hat...
ne andere sprache als c++ verwenden

geht in c++ genauso wie in jeder anderen sprachen.
-
@Shade Of Mine: ja, ist mir schon klar, ist dasselbe bei Bäumen, die haben auch Nodes die auf Nodes zeigen die auf Nodes zeigen die auf Nodes zeigen... und irgendwann ist halt Schluss.
Das was du meinst sollte in jeder vernünftigen Sprache möglich sein.
@thordk: Danke für dein äusserst schlaues Kommentar, bloss das was ich meinte ist in keiner Sprache möglich, da es eben überhaupt nicht möglich ist.