Problem mit Inkludiersystem



  • Was ist nun, wenn ich von CDataHandler aus eine Methode namens raiseError() von CMyWindow aufrufen will?



  • includierst du MyWindow.h in DataHandler.cpp (UNTER #include "DataHandler.h")



  • Aber ich muss doch in der Definition der Klasse CDataHandler in "CDataHandler.h" ein Objekt erzeugen: "CMyWindow m_MyWindow;".



  • intidscha schrieb:

    Aber ich muss doch in der Definition der Klasse CDataHandler in "CDataHandler.h" ein Objekt erzeugen: "CMyWindow m_MyWindow;".

    Du meinst, ein CMyWindow enthält ein CDataHandler, und ein CDataHandler enthält ein CMyWindow? Wie soll das funktionieren? CDataHandler enthält CMyWindow enthält CDataHandler enthält CMyWindow enthält CDataHandler enthält CMyWindow usw.

    Das terminiert nicht.

    Du solltest vielleicht nochmal dein Design überarbeiten, und genau klären, welche Objekte welche anderen Objekte besitzen, und welche möglicherweise nur Verweise (Referenzen) auf andere Objekte haben.

    Ich habe den Eindruck, dass du Member nur deswegen anlegst, damit du deren Methoden aufrufen kannst. Das ist aber nicht der Sinn von Membern.



  • Okay, das klingt natürlich einleuchtend. Aber es ist mir ein Rätsel, wie ich dann Methoden des parents aufrufen können soll (Beispiel raiseError()).



  • intidscha schrieb:

    Aber es ist mir ein Rätsel, wie ich dann Methoden des parents aufrufen können soll (Beispiel raiseError()).

    Zum Beispiel indem du dem abhängigen Objekt bei der Erzeugung eine Referenz auf seinen "Parent" mitgibst.



  • Aber dann muss ich dieses Parent doch wieder als nen Pointer auf ein CMyWindow-Objekt speichern. Oder welchen Typ soll ich dann verwenden, damit ich dann auch die Methode aufrufen kann?



  • intidscha schrieb:

    Aber dann muss ich dieses Parent doch wieder als nen Pointer auf ein CMyWindow-Objekt speichern.

    Besser als Referenz. Das ist auch kein Problem, denn für Referenz- oder Zeigermember brauchst du keine vollständige Klassendefinition, also auch keine Includedirektive. Da reicht eine Forward Declaration.

    Erst wenn du die Klasse benutzt, brauchst du die Definition, d.h. eine Includedirektive in der .cpp-Datei.



  • CMyWindow* dürfte schon der richtige Typ sein - und um dort wechselseitige Abhängigkeiten zu vermeiden, gibt es Forward-Deklarationen:

    //DataHandler.h
    
    class CMyWindow;//Deklaration
    
    class CDataHandler
    {
      ...
    private:
      CMyWindow* parent;
      ...
    };
    
    //DataHandler.cpp
    #include "DataHandler.h"
    #include "MyWindow.h"
    
    void CDataHandler::doSomething()
    {
      parent->do_this();
    }
    


  • Vielen Dank, das klappt super. 👍


Anmelden zum Antworten