fehler bei querverweis #include".." von header datei



  • hallo, folgendes problem.

    datei cresourced.h

    #include "CCaptionD.h"
    
    enum cWndTyp
    {
      cEdit = 1,
      cComboBox,
      cButton,
      cTabCtrl,
      // callback WM_GET_TYP
      cPanelCtrl,
      cDlgMask,
      cWndFrame,
      cFrame,
    
      cClass = 0xffff,
    };
    
    struct eWnd
    {
      cWndTyp    nTyp;
      CWnd*      pWnd;
      CWnd*      pParent;
      bool       bSubClass;
      CCaptionD* pContainer;           //hier ist der querverweis
    };
    
    ....
    

    #include "CResourceD.h" //hier der andere querverweis

    datei ccaptiond.h

    class AFX_EXT_CLASS CCaptionD : public CWnd
    {
      DECLARE_DYNAMIC(CCaptionD)
    
    public:
    //...
      void SetChild(CWnd* pWnd, cWndTyp tTyp);   //hier brauche ich enum von  cresourced.h
    
    //...
    };
    

    wie kann ich das umgehen. gelesen habe ich das schon mal haber ich kann es nicht finden. bitte helft mir.

    danke volker



  • Hi, stimmen die zwei Cs in "CCaptionD.h" oder ist da ein C zu viel?



  • [cpp]
    class CCaptionD; // <<--------------- foward deklaration

    enum cWndTyp
    {
    cEdit = 1,
    cComboBox,
    cButton,
    cTabCtrl,
    // callback WM_GET_TYP
    cPanelCtrl,
    cDlgMask,
    cWndFrame,
    cFrame,

    cClass = 0xffff,
    };

    struct eWnd
    {
    cWndTyp nTyp;
    CWnd* pWnd;
    CWnd* pParent;
    bool bSubClass;
    CCaptionD* pContainer; //hier ist der querverweis
    };[/cpp]

    [ Dieser Beitrag wurde am 24.02.2003 um 09:30 Uhr von Knuddlbaer editiert. ]



  • hallo,

    mein problem konnte ich mit deiner hilfe nicht ganz lösen.
    es ist so, dass in beiden header dateien

    -CResourceD.h enum cWndTyp deklariert
    -CCaptionD.h

    jeweils eine gegenseitige abhänigkeit besteht
    #include ".."

    -> error C2061 Bezeichner cWndTyp in CCaptionD.h

    ich denke ich muß mit #ifdef #endif include ausklammern.
    aber wo finde ich so was?

    Volker



  • Hi Volker,

    ich sehe in cresourced.h nur eine Abhängigkeit:

    CCaptionD* pContainer;

    Da es sich hierbei um einen Zeiger handelt kannst Du eine forwarddeklaraation benutzen.

    class pContainer;

    Das #include "CCaptionD.h" lässt Du dann weg.

    In ccaptiond.h includierst Du dann cresourced.h

    Wenn sich dann der Compiler beschwert das er einen Datentyp nicht kennt der NICHT in cresourced.h deklariert ist fehlt ein Header in der CCptionD.h .

    Ich hoffe es hilft nun weiter, wenn nicht schreib mal genau was Du gemacht hast.
    Mit der Compilermeldung oben kann ich nix anfangen.

    Gruß
    Michael



  • hallo,

    danke erst mal, ich werde es heute abend wenn ich zeit habe propieren.

    wegen dem error

    // CResourceD.h
    
    typedef enum cWndTyp                //wird in CCaptionD Func SetChild benötigt
    {
      cEdit = 1,
      cComboBox,
      cButton,
      cTabCtrl,
      // callback WM_GET_TYP
      cPanelCtrl,
      cDlgMask,
      cWndFrame,
      cFrame,
    
      cClass = 0xffff,
    };
    
    // CCaptionD
    
    #include "CResourceD.h"
    #include "afxtempl.h"
    
    class AFX_EXT_CLASS CCaptionD : public CWnd
    {
      DECLARE_DYNAMIC(CCaptionD)
    
    public:
      CCaptionD();
      virtual ~CCaptionD();
    
      BOOL Create(LPCTSTR sCaption, CWnd* pParent, DWORD dwStyle = WS_BORDER, UINT nID = 0);
      void SetChild(CWnd* pWnd, cWndTyp tTyp);   //hier error cWndTyp nicht deklariert
    

    volker



  • Hi!

    Das Problem ist folgendes:

    cresourced.h macht #include "CCaptionD.h" . Dieser wird an diese Stelle
    eingefügt.

    Das ist so als wenn Du schreibst:

    i = 12;
    int i;

    Der Compiler kennt in diesem Header den Typ nicht da er noch nirgens steht.
    Mit der Fwd Deklaration kannst Du Dir das #include "CCaptionD.h" sparen. Der Compiler liest also die komplette cresourced.h und kennt damit den Typ cWndTyp.

    Die CCaptionD includiert nun die Resourcen. Und das klappt.

    Da wo ein #include steht wird der Inhalt der Datei eingefügt.
    Ohne includewächter gibt das bei Dir Chaos weil die eine Datei die andere reinzieht und das mehrmals 🤡 (es sei denn Du hast #pragma once bei VC oder #ifndef #define #endif)

    Spielen wir mal Präprozessor (wenn man das so schreibt):

    // START #include "CCaptionD.h"
    class AFX_EXT_CLASS CCaptionD : public CWnd
    {
      DECLARE_DYNAMIC(CCaptionD)
    
    public:
    //...
      void SetChild(CWnd* pWnd, cWndTyp tTyp);   //hier brauche ich enum von  cresourced.h
    
    //...
    };
    // ENDE #include "CCaptionD.h"
    
    enum cWndTyp
    {
      cEdit = 1,
      cComboBox,
      cButton,
      cTabCtrl,
      // callback WM_GET_TYP
      cPanelCtrl,
      cDlgMask,
      cWndFrame,
      cFrame,
    
      cClass = 0xffff,
    };
    
    struct eWnd
    {
      cWndTyp    nTyp;
      CWnd*      pWnd;
      CWnd*      pParent;
      bool       bSubClass;
      CCaptionD* pContainer;           //hier ist der querverweis
    };
    

    Warum brauchst Du das #include ? Weil der Compiler sonst meckert das er CCaptionD nicht kennt. Der Compiler will aber bei einem Zeiger und einer Referenz nur wissen ob es den Typ gibt. Er muß die größe hier nicht bestimmen.
    Deswegen reicht es wenn Du am anfang class CCaptionD schreibst.

    In der .cpp kann das anderst aussehen, dort wirst Du dann die cpation.h includieren müssen. (Ist eh besser so wenig wie möglich im Header zu inkludieren, was aber nicht heissen soll das man indirekte Includes verwenden sollte....)

    // Kommentar
    Würde da nun
    CCaptionD pContainer; //hier ist der querverweis

    stehen wäre das Problem nicht Lösbar da der Compiler die größe des Types bestimmen muß.
    // end Kommentar

    Siehst Du nun warum sich der Compiler beschwert ? Mach das mal mit der Fwd Deklaration und Du wirst sehen es geht 🙂

    [ Dieser Beitrag wurde am 25.02.2003 um 11:41 Uhr von Knuddlbaer editiert. ]



  • hallo,

    ich muß sagen, ich bin schwer begeistert wie du mir das problem erklärt hast,
    und wie du schon sagtest, es funktioniert.

    ich programmiere schon ziemlich lange (zwar nur vb mit viel api)
    aber durch mein studium bin ich zu c++ gewechselt.
    da habe ich halt immer noch so meine kleinen probleme.

    aber die erklärung war spitze, danke noch mal

    volker



  • np dafür is das forum ja da 🤡


Anmelden zum Antworten