Reihenfolge von Klassendeklarationen - incomplete type
-
Hallo zusammen,
ich möchte eine Klasse in einer anderen aufrufen:
class b; class a { b B; }; class b { }; int main(int argc, char *argv[]) { return (0); }Mit Dev-C++ kompiliert, kommt folgende Fehlermeldung:
field `B' has incomplete type
Das verstehe ich nicht. Ich habe doch eine leere Deklaration von Klasse b vor die Deklaration von Klasse a gestellt. Was ist falsch?
Grüße,
CMike
-
Das Problem ist, dass a eine Definition von b benötigt. Es gibt an dieser Stelle jedoch nur eine Deklaration der Klass b. Die Definition der Klasse b kommt dann erst unter der Definition von der Klasse a.
Simon
-
Für die Defintion von a muss der Compiler wissen wie groß b ist. das ist ihm zu dem Zeitpunkt nicht bekannt. Das heißt die Defintion von b muss vor a stehen.
class b { }; class a { b B; };Eine andere Lösung ist der Klasse a einen Zeiger auf b zu verpassen. Unabhängig von der Defintion von b weiß der Compiler dass ein b* 4byte oder ein anderer Wert (je nach Platform) groß ist.
class b; class a { b* B; };In diesem Fall braucht der Compiler die Definition von b erst, wenn Methoden von b aufgerufen werden B->f();
-
-
Weil so´n Spaß macht, hier gleich noch ein paar Zeilen Code dazu:
#include <cstdlib> #include <iostream> using namespace std; class b; class a { int i; b* B; // hier mit Pointer aufrufen, weil Größe von b im Memory bekannt sein muss, siehe: // http://www.c-plusplus.net/forum/viewtopic-var-t-is-258407.html // die folgende Zeile gäbe hier einen Fehler, weil B->f1 noch nicht definiert ist //i = B->f1; void f1(); }; // hier würde die Definition von a::f1 einen Fehler auslösen, weil B->f1 noch // nicht definiert ist. /* void a::f1() { int i = B->f1(); } */ class b { public: int f1() { return(0); }; }; // so läuft´s void a::f1() { int i = B->f1(); } int main(int argc, char *argv[]) { b *B1, B2; B1->f1(); B2.f1(); system("PAUSE"); return EXIT_SUCCESS; }Nochmals Danke für die Anregungen.
Grüße,
CMike
-
Willkommen im Forum cmkike
hier noch ein Tipp
Versuche system("pause"), wenn möglich zu vermeiden
-
Darf ich dir auch noch den Beitrag hier empfehlen:
Definitionen und Deklarationen in C++
-
@ [MOP]: Danke für den Tipp!
@ drakon: Danke für den Link. Das ist genau die Art Erläuterung, die ich gesucht habe!
Grüße,
CMike