Rekursive Includes und Forwarddeklarationen



  • Ich habe gerade bisl verständnisprobleme mit dem Linken bzw. den #include Angaben.

    Mein Project besteht aus:
    Application.h/cpp
    Karusell.h/cpp
    createUI.h/cpp
    Kamera.h/cpp
    main.cpp

    Folgendermaßen sind die Beziehungen: ( A -> B bedeutet A includiert 😎

    main.cpp -> Application.h
    Application -> Kamera.h
    Application -> Karusell.h (Karusell ist Teil der Application)
    Karusell -> Application.h (Karusell bekommt im Constructor die Application übergeben. Quasi ein Pointer auf den Vater)

    Wie man sieht hat man da ne astreine rekursive Abhängigkeit.

    Ohne irgendwelche Forward-Deklarationen meckert er in Karusell.h an, dass man Application so nicht definieren dürfte. Is natürlich eine missinterpretation die daher kommt, dass ich Application als Typ für eine Membervariable benutze, er Application aber noch nicht kennt.

    Meine Idee war eine der Beiden Klassen per forward-Definition anzugeben. Leider funktioniert beides nicht.
    Wenn ich in Karusell die Application "vormerke" kommt:

    ../src/Application.h:16: error: ISO C++ forbids declaration of `Karusell' with no type
    

    Wenn ich in Application das Karusell "vormerke" kommt:

    ../src/Karusell.h:25: error: ISO C++ forbids declaration of `Application' with no type
    

    Wenn ich beide "vormerke" gehts.
    Aber irgendwie hab ich Bauchschmerzen, denn ich kann mir nicht vorstellen, dass man eine gegenseitige Aggregation nicht anders lösen kann.

    Wieso das Ganze überhaupt? Nun in Karusell.cpp muss ich einige Flags der Application auslesen, damit ich weiß wie Karusell darzustellen ist. Application ist der Chef. Neben dem Karusell verwaltet diese Klasse auch noch einen GUI-Manager, welcher die Nutzereingaben in den Flags der Application speichert. An die muss ich jetzt von Karusell aus rankommen.

    Ziel war eigentlich eine schön übersichtliche Projektstruktur zu bauen, aber so langsam bekomm ich wieder das Gefühl nen großen Flickenteppich zu bauen... :?

    Meine Frage wäre nun: Wie würdet ihr das Problem angehen?



  • Extern Deklaration "class application" in das Karusell, in der Klasse nur mit Pointern zu application arbeiten und in der .cpp die application.h inkludieren.
    Alles klar 🙂 ?



  • Öhm..hui...extern declaration?

    Könntest du das etwas genauer erklären?



  • Möchte nochmal nachfragen wie das jetzt gemeint war.

    Danke



  • Wenn sich zwei Klassen gegenseitig einbinden sollen, geht das sowieso nur über Pointer oder Referenzen, andernfalls würdest du ein unendlich großes Objekt (Karussel enthält Application enthält Karussel ...) erhalten. Und bei Pointern/Referenzen reicht auch eine Forward-Deklaration:

    //Karussel.h
    class Application;
    
    class Karussel
    {
    public:
      Karussel(Application* app, string name);
      ...
    private:
      Application* my_app;
    };
    
    //Application.h
    #include "Karussel.h"
    #include <vector>
    
    class Application
    {
    public:
      Application();
      void add_karrussel(string name);
    private:
      std::vector<Karussel> my_jahrmarkt;
    };
    


  • Headhunter schrieb:

    Extern Deklaration "class application" in das Karusell, in der Klasse nur mit Pointern zu application arbeiten und in der .cpp die application.h inkludieren.
    Alles klar 🙂 ?

    Wie kommst du auf extern? Eine simple forward declaration reicht da.

    @Anfänger06

    Mach das #include "application.h" aus "karusell.h" raus und pack es in karusell.cpp
    Und dafür schreibst du in karusell.h vor der klasse Karusell folgende Zeile:

    class Application
    

    Sollte dann ungefähr so aussehen:

    class Application;
    class Karusell
    {
    public:
       Karusell( Application * parent );
    ...
    

Anmelden zum Antworten