Gegenseitiges "Includieren" von .h-Files zweier Klassen



  • Hallo Experten,
    habe ein dummes Anfängerproblem :
    Es existiert eine Class 'a' und eine Class 'b'. Jede Klasse besitzt die andere Klasse; also Class 'a' besitz eine Class 'b' und umgekehrt. In jeder .h-Datei wird das andere .h-File includiert.

    Ich arbeite mit Qt Creator 4.4.1 und verwende den Compiler 'mingw32'
    Der Compiler meldet den Fehler "'a' does not name a type".

    Hier die komplette Ausgabe:
    In file included from ..\ab\a.h:4:0,
    from ..\ab\a.cpp:1:
    ..\ab\b.h:10:5: error: 'a' does not name a type
    a _a;
    ^
    Makefile.Debug:111: recipe for target 'debug/a.o' failed
    mingw32-make[1]: Leaving directory 'C:/_apd/Qt_workspace/build-ab-Desktop_Qt_5_9_3_MinGW_32bit-Debug'
    mingw32-make[1]: *** [debug/a.o] Error 1
    Makefile:36: recipe for target 'debug' failed
    mingw32-make: *** [debug] Error 2
    12:45:34: Der Prozess "C:\Qt\Qt5.9.3\Tools\mingw530_32\bin\mingw32-make.exe" wurde mit dem Rückgabewert 2 beendet.
    Fehler beim Erstellen/Deployment des Projekts ab (Kit: Desktop Qt 5.9.3 MinGW 32bit)

    Für Euch eine Kleinigkeit !
    Vielen Dank im voraus !

    a.h :
    ========
    #ifndef A_H
    #define A_H
    
    #include "b.h"
    
    class a
    {
     public:
         a();
         b _b;
    };
    #endif // A_H
    
    a.cpp :
    =======
    #include "a.h"
    
    a::a()
    {
    
    }
    
    b.h :
    =====
    #ifndef B_H
    #define B_H
    
    #include "a.h"
    
    class b
    {
     public:
         b();
         a _a;
    };
    #endif // B_H
    
    b.cpp :
    =======
    #include "b.h"
    
    b::b()
    {
    
    }
    


  • hi

    dss geht so nicht. das nennt sich zirkulaere abhängigkeit oder so aehnlich.
    entweder du machst das mit forwaertsdeklaration und bindest die header files in der cpp-datei ein, wobei du dann jweils das andere objekt in der klasse mittels new erstellst, oder du machst das mit templates.
    du solltest dir eher ueberlegen ob das vom design her wirklich das ist was du willst/brauchst.

    Meep Meep



  • Zum Grund: Vielleicht überlegst du dir mal von Hand, wie groß denn in deinem Design ein Objekt vom Typ a ist (das muss der Compiler auch tun). Du wirst feststellen, dass zu zur Berechnung der Größe von a die Größe von b kennen musst. Um die Größe von b zu bestimmen, musst du allerdings die Größe von a kennen und so weiter.

    Als Lösung kannst du Pointer nutzen.



  • Mit einer Vorwärtdeklaration und einem Pointer auf das andere Objekt tut's.
    Habe auch die Hintergründe verstanden.
    Nochmals vielen Dank! 👍


Log in to reply