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();



  • @Theta & BrotBernd

    Vielen Dank für Eure superschnellen Antworten! So ist es klar.

    Grüße,

    CMike



  • 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


Anmelden zum Antworten