Überkreuz Klassen verwenden
-
Hallo!
Wie kann ich denn wenn ich 2 Klassen in 2 verschiedenen (Header)-Dateien habe, die sich gegenseitig als Membervariablen benutzen, das dem Compiler unterjubeln? Ich habe etwas in der Art:
//Datei a.h #ifndef AH #define AH #include "z.h" class Z; //forward Deklaration class A { Z z; public: void benutzeZ() { z.tueZ(); } void tueA() { //irgendwas } }; #endif //Datei z.h #ifndef ZH #define ZH #include "a.h" class A; //forward Deklaration class Z { A a; public: void benutzeA() { a.tueA(); } void tueZ() { //bla } }; #endif
Der Compiler beschwert sich immer, dass A oder Z unbekannt wären.
wie kann ich das lösen?
-
Willst du uns ärgern? Das kann doch garnicht funktionieren.
-
Versuch irgendwas zu verwenden, was mit einer Forward-Deklaration auskommt.
-
//bar.hh class foo; class bar { foo *foo_m; public: //denk dran copy-operator und cctor zu überladen! bar(); ~bar(); //... }; //foo.hh class bar; class foo { bar *bar_m; public: //denk dran copy-operator und cctor zu überladen! bar(); ~bar(); //... }; //bar.cc #include "bar.hh" #include "foo.hh" bar::bar() : foo_m(new foo) { } bar::~bar() { delete foo_m; } //foo.cc #include "foo.hh" #include "bar.hh" foo::foo() : bar_m(new bar) { } foo::~foo() { delete bar_m; }
so ungefähr
-
Bin ich der Einzige, der da einen Stapelüberlauf sieht?
-
lol kingruedi
-
ich habe das gleich prob !
bitte helft mir weiter unter borland war das immer voll ok .. in VC macht der immer nen fehlerclass CGridSquare; //--------------------------------------------------------------// // klasse: CGrid // beschreibung: klasse des Prospektoren-Plans //--------------------------------------------------------------// class CGrid { CGridSquare m_gsXCoord[80]; CGridSquare m_gsYCoord[24]; public: CGrid(); int CreateGrid(); int LoadGrid(); };
fehlermeldung
d:\Temp\c++ work area\grab\grid.h(29): error C2079: 'CGrid::m_gsXCoord' verwendet undefiniertes class 'CGridSquare'
-
Hey, das kann ja gar ncith funzen...
class A
{
B b;
};class B
{
B b;
}Wenn man das kompilieren könnte, dann würde doch die eine Klasse die andere immer wieder einbinden, und dann entstehen unendlich viele Konstruktor-Aufrufe und dann... stürzt das Prggi ab
Versuchs mal mit Zeigern, da brauchste keine Beschreibung der Klasse.
-
Wo isn das???
Zu ulath würd ich sagen:
Du kannst nur definierte Klassen zurückgeben, wenn der Compiler nicht weis, was er von der Funktion zu erwarten hat kann er sie nicht durchgehen lassen.mfg
Glamdring