none
include loop, Klassenpointer RRS feed

  • Frage

  • Hallo,

    ich habe gerade das problem mit dem inlude loop bzw. der loop kommt nicht zu stande da ich die include guards nutze, jedoch wird der der typ eines Klassenzeigers nicht erkannt, da die zugehörige Header schon includiert wurde, so wie ich das verstehe.

    Hier mal ein ausschnitt:

    //Network.h #ifndef NETWORK_H #define NETWORK_H #include "KeylessDlg.h" class CNetwork{ private: CKeylessDlg *pKeyless;//Hier tritt das Problem auf } #endif //Network.cpp

    #include "stdafx.h"
    #include "Network.h"

    void CNetwork::Init(void){ pKeyless = new CKeylessDlg; } //KeylessDlg.h #ifndef KEYLESSDLG_H #define KEYLESSDLG_H #include "vxlapi.h"
    #include "Network.h"
    #include "Messung.h"
    #include "ECOSTEP200.h"
    #include "MesseinstellungenDlg.h"
    #include "Keyless.h" class CKeylessDlg : public CDialogEx{ private:     CNetwork *pNetwork;//EDIT: Sorry sollte nicht CMessung heißen } #endif //KeylessDlg.cpp

    #include "stdafx.h"
    #include "KeylessDlg.h"

    BOOL CKeylessDlg::OnInitDialog(){         pNetwork    = new CNetwork; //EDIT: Sorry kein CMessung
    }


    ich weiß nicht so recht wie ich das mache mit dem includieren und mit den Funktionsprototypen komme ich auch noch nicht so klar.





    Montag, 16. März 2015 13:56

Antworten

  • Hallo,

    daß sich die Header-Dateien gegenseitig includen, geht im C++ soweit ich weiß nicht.

    Allerdings mußt du in den Header-Dateien auch nur solche includen, auf die du innerhalb der Header-Datei auch wirklich zugreifst. In der Network.h beziehst du dich auf den Typ CKeylessDlg, also bruachst du in Network.h den Include auf KeylessDlg.h. So steht es schon in deinem Beispiel. Wenn du in der KeylessDlg.h keinen Typen bzw. keinen Bezug auf Network.h hast, brauchst du dort auch nicht die Network.h includen.

    Wenn du also den Typ CNetwork nicht in der KeylessDlg.h benötigst, sondern nur in der KeylessDlg.cpp, genügt es, wenn du nur in der cpp-Datei den Include der Network.h einfügst.

    Wenn du aber in beiden h-Dateien den Typ aus der jeweils anderen benötigst, muß man in einer den Include für die andere entfernen und stattdessen den Typ aus der entfernten kurz definieren. Der Include erfolgt dann in der cpp-Datei.

    #pragma once
    
    //#include "KlasseB.h"
    
    class KlasseB;
    
    class KlasseA
    {
    	KlasseB	* Nachbar;
    };

    Link

    Statt #ifndef kann man #pragma once als erstes in die Headerdatei schreiben, um sie für eine cpp-Datei nur einmal includen zu lassen.

    Ich hoffe, ich habe dir nichts Falsches erzählt, meine C++ Zeit ist schon eine Weile her.

    Gruß
    Heiko


    • Bearbeitet Heiko65456465 Montag, 16. März 2015 21:22 Korrektur
    • Als Antwort markiert cybertronicx Dienstag, 17. März 2015 08:31
    Montag, 16. März 2015 20:00