Probleme mit den Header-Dateien bei bidirektionalen Objektreferenzen...



  • Kurzform der Frage: Wie kriegt man es hin, dass sich 2 Klassen gegenseitig kennen?? Ich hab hier Probleme mit den include-Dateien.

    Hallo,

    ich habe noch nicht sehr viel Erfahrung mit C++ (aber mit OO-Programmierung) und hab daher eine Frage zu folgendem Problem:

    Ich habe eine Klasse A (Dateien A.h und A.cpp) und eine Klasse B (Dateien B.h und B.cpp). Die Klasse A soll eine Membervariable vom Typ der Klasse B haben und die Klasse B soll wiederum eine Membervariable vom Typ der Klasse A haben - somit haben wir eine bidirektionale Hat-Beziehung.

    Bei der Implementierung dessen, ist es ja nun erforderlich, dass die Datei A.h die Datei B.h inkludiert (damit sie den Typ B kennt). Gleichsam ist es auch erforderlich, dass die Datei B.h die A.h inkludiert, damit sie den Typ A kennt. Die *.cpp-Dateien inkludieren dann nur noch die für sie relevante *.h-Datei.

    Hier spielt irgendwie mein Linker verrückt - offensichtlich handelt es sich um ein Problem der Sorte "die katze beißt sich in den Schwanz"...Ich hab dann mal versucht, die *.h-Dateien mit den folgenden Prä-Prozessor-Direktiven zu versehen:

    #ifndef _A_ //...für Klasse A
    #define _A_
    ......//includes und Klassendeklaration

    #endif

    Der effekt war, dass nun beim Compilieren, die Typen nicht mehr erkannt wurden, weil offensichtlich, die *h-Dateien nur 1mal im Projekt inkludiert wurden (Tatsächlich gibt es ja aber im Projekt 2 #include "A.h" - Anweisungen, nämlich einmal in A.cpp und einmal in B.h).

    Kurzum:
    ******
    Wie kann ich dieses Problem lösen?? Wie sind solche bidirektionalen Objektreferenzen in C++ realisierbar???

    Danke für jeden Hinweis.



  • Direkt als Member kannst du das nicht wechselseitig einbinden - sonst erhältst du unendlich große Objekte. Aber du kannst gegenseitig Referenzen oder Pointer einbauen - dazu benötigst du Forward-Deklarationen:

    //A.h
    #ifndef A_H
    #define A_H
    class B;
    
    class A
    {
      B* my_B;
    };
    
    #include "B.h"
    #endif
    //B.h
    #ifndef B_H
    #define B_H
    #include "A.h
    
    class B
    {
      A* my_A;
    };
    #endif
    

Anmelden zum Antworten