Probleme mit Vorwärtsdeklaration
-
Servus,
ich arbeite im Moment an einem größeren Projekt, weswegen ich mein Problem in etwas kleinerer Form darstelle. Es geht um die Vorwärtsdeklaration - erstmal die Dateien:
// ClassA.h #ifndef __CLASSA_H__ #define __CLASSA_H__ #include <iostream> #include "ClassB.h" using namespace std; class B; class ClassA { public: static int TestFunction() { cout << "This is ClassA::TestFunction()"; ClassB::TestFunction(); } static void TestFunction2() { cout << "This is ClassA::TestFunction2()"; } }; #endif // __CLASSA_H__
// ClassB.h #ifndef __CLASSB_H__ #define __CLASSB_H__ #include <iostream> #include "ClassA.h" using namespace std; class ClassA; class ClassB { public: static int TestFunction() { cout << "This is ClassB::TestFunction()"; ClassA::TestFunction2(); } }; #endif // __CLASSB_H__
// Main.cpp #include "ClassA.h" int main() { ClassA::TestFunction(); return 0; }
Dieses kleine Programme sollte folgendes tun:
- ClassA::TestFunction() aufrufen
- in ClassA::TestFunction(): "This is ClassA::TestFunction()" ausgeben und ClassB::TestFunction() aufrufen
- in ClassB::TestFunction(): "This is ClassB::TestFunction()" ausgeben und ClassA::TestFunction2() aufrufen
- in ClassA::TestFunction2(): "This is ClassA::TestFunction2()" ausgeben
Das Problem ist, dass ich schon beim kompilieren eine Fehlermeldung bekomme:
Kompilieren... Main.cpp c:\C++ Test\ClassB.h(17) : error C2027: Verwendung des undefinierten Typs "ClassA" c:\C++ Test\ClassB.h(9): Siehe Deklaration von 'ClassA' c:\C++ Test\ClassB.h(17) : error C3861: 'TestFunction2': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
Könnt ihr helfen? Ich quäle mich nun schon seit mehreren Tagen mit diesem Problem rum und hab es geschafft, das ganze auf 2 Fehlermeldungen zu minimieren. Doch jetzt komm ich einfach nicht mehr weiter. Es wäre super, wenn ihr helfen könntet! Vielen Dank schonmal!
-
fwd Deklaration geht nur bei Zeiger oder Referenz.
IMHO will der Compiler bei ClassA::TestFunction2(); aber schon wissen wie ClassA genau aussieht. => in die .cpp auslagern den Teil
btw macht #include "ClassA.h" und später class ClassA keinen Sinn
-
Vielen Dank, das funktioniert!
Was ist aber, wenn Klasse A die Klasse B, Klasse B die Klasse A nutzt und Klasse A von B abgeleitet ist?
Dann muss die #include-Anweisung von ClassB ja zwangsläufig im Header stehen, oder?
-
Was ist aber, wenn Klasse A die Klasse B, Klasse B die Klasse A nutzt und Klasse A von B abgeleitet ist?
Wenn du eine Klasse von einer anderen erben lässt, werden auch alle Methoden vererbt, warum sollte also Klasse A extra Klasse B benutzen, wenn sie doch selbst eh die Methode hat
-
Was ist aber, wenn Klasse A die Klasse B, Klasse B die Klasse A nutzt und Klasse A von B abgeleitet ist?
Da sag ich mal, hast du einen schweren Designfehler (oder gibts sowas wirklich?).
Ansonsten sehe ich aber eigentlich kein Problem:
class B; class A { B* bla; }; class B : public A { };
-
Hier erstmal die aktuelle Fassung:
// ClassA.h #ifndef __CLASSA_H__ #define __CLASSA_H__ #include <iostream> #include "ClassB.h" using namespace std; class ClassB; class ClassA { public: static int TestFunction(); static void TestFunction2(); }; #endif // __CLASSA_H__
// ClassA.cpp #include "ClassA.h" int ClassA::TestFunction() { cout << "This is ClassA::TestFunction()" << endl; ClassB::TestFunction3(); return 0; } void ClassA::TestFunction2() { cout << "This is ClassA::TestFunction2()" << endl; }
// ClassB.h #ifndef __CLASSB_H__ #define __CLASSB_H__ #include <iostream> #include "ClassA.h" using namespace std; class ClassA; class ClassB: public ClassA { public: static int TestFunction3(); }; #endif // __CLASSB_H__
// ClassB.cpp #include "ClassB.h" int ClassB::TestFunction3() { cout << "This is ClassB::TestFunction3()" << endl; ClassA::TestFunction2(); return 0; }
// Main.cpp #include "ClassA.h" int main() { ClassA::TestFunction(); system("PAUSE"); return 0; }
Hier sieht man, dass ich ClassB von ClassA ableite - dabei bekomme ich folgenden Fehler:
ClassA.cpp c:\Dokumente und Einstellungen\Christoph\Desktop\C++ Test 2\ClassB.h(12) : error C2504: 'ClassA': Basisklasse undefiniert Main.cpp c:\Dokumente und Einstellungen\Christoph\Desktop\C++ Test 2\ClassB.h(12) : error C2504: 'ClassA': Basisklasse undefiniert
Mir ist klar, dass das damit zusammenhängt, dass im Header abgeleitet wird (in dem ClassA ja noch undefiniert ist) - aber wie kann man das Problem lösen?
-
Weis denn niemand eine Lösung?
-
So wie du das jetzt machen willst ist das Müll, weil du in ClassA schon ClassB benutzt, die aber erst von A abgeleitet werden muss, also wäre B schon in A, obwohl B aus A besteht, das kann ja nicht gehen.
Du darfst in ClassA.h nicht ClassB.h includen und in ClassB.h brauchst du keine forward deklaration, weil du ClassA.h sowieso includest und dann musst du über einen Pointer, der erst zur Laufzeit gesetzt wird in ClassA auf ClassB zugreifen. Dann müsste es gehen.
-
In Deinem Letzten Code hast Du wieder ein gegenseitiges #include drin.
Das ist das gleiche Problem wie hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=72976&highlight=
Du solltest Dir schon überlegen wo Du ein #include verwendest und wo eine Vorwärtsdeklartion.Viel Erfolg
DJohn