Header gegenseitig einbinden: fehler



  • Hallo!

    Ich werde mit diesem Visual Studio noch Wahnsinnig...
    Manchmal verhält es sich echt seltsam:

    Also, ich habe eine Klasse CMain.
    Des weiteren eine Klasse CClass und CDerived wobei letztere die
    Tochterklasse von CClass ist. In CClass gibt es eine Memberfunktion
    die einen Pointer auf CMain als Parameter hat.
    Die Klasse CMain hat als Attribut einen Pointer auf CDerived.

    Nun habe ich folgendes Problem beim Kompillieren:
    error C2504: 'CClass' : Basisklasse undefiniert

    Es liegt hier wohl so ein zirkulierendes Header-Problem vor, denn ich habe natürlich

    #include "Class.h"
    class CClass;
    

    über der Klassendef. -> die Basisklasse sollte daher auf jeden Fall bekannt sein.

    Wie müssen hier die #Includes aussehen dass er nicht im Kreis läuft und sich dann wo stößt? (so stells ich mir halt vor 😋 )

    Gibt keine Funktion im Visual Studio dass jeder Header autom. jede andere Header bekannt ist?

    Ich kopier jetzt seid 2 Stunden wie eine Blöde die Includes herum aber es hilft alles nichts...

    Bitte helft mir!!!
    Vielen Dank!
    tanya



  • hast du überall in deinen headern include guards drin?
    also

    #ifndef MYHEADER_H
    #define MYHEADER_H
    ...
    #endif
    


  • Ja selbstverständlich!
    Alle Header hab ich mit dem Klassenassistenten erstellt, der fügt das ja automatisch rein.

    Ich steck noch immer bei diesem (unnötigen) Problem fest



  • Hi

    tanya schrieb:

    Nun habe ich folgendes Problem beim Kompillieren:
    error C2504: 'CClass' : Basisklasse undefiniert

    In welcher Headerdatei tritt dieser Fehler auf?

    Grüße Rapha



  • in Derived.h
    ..
    ich fand einen Artikel auf CodeGuru, der mein Problem eigentlich als
    "circular references" und "mutually inclusive header files"
    relativ gut beschreibt:
    http://www.codeguru.com/forum/showthread.php?threadid=288147

    Nur: Das wusste ich auch schon vorher!!

    Die Frage ist: Wie umgehe ich das?



  • Hier vielleicht der Code:

    #if !defined(AFX_DERIVED_H__4FFA1656_1DD8_421B_A092_5EC65AE523FA__INCLUDED_)
    #define AFX_DERIVED_H__4FFA1656_1DD8_421B_A092_5EC65AE523FA__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include "Class.h"
    class CClass;
    
    class CDerived : public CClass  // Basisklasse undefiniert!?
    {
    
    public:
    	CDerived();
    	virtual ~CDerived();
    
    };
    
    #endif // !defined(AFX_DERIVED_H__4FFA1656_1DD8_421B_A092_5EC65AE523FA__INCLUDED_)
    

    Mit dem Code passt alles. Es liegt nur an den "circular header includes"



  • Gibt es in CClass einen Zeiger auf CDerived (bzw. komm CDerived in irgendeiner Form vor)?
    Wenn ja, dann lösche in "Class.h" das "#include "Derived.h"" und schreibe dafür "class CDerived;".
    Wie gesagt, ich bin jetzt davon ausgegangen, dass CDerived irgendwie in CClass vorkommt

    Grüße Rapha



  • Nein, gibt es nicht 😕

    Ich poste jetz einfach mal den relevanten Code:

    Derived.h

    #include "Class.h"
    class CClass;
    
    class CDerived : public CClass
    {
    
    public:
    	CDerived();
    	virtual ~CDerived();
    
    };
    

    Class.h

    #include "Main.h"
    class CMain;
    
    class CClass
    {
    public:
    	bool Init(CMain *pMain);
    public:
    	CClass();
    	virtual ~CClass();
    };
    

    Main.h

    #include "Derived.h"
    class CDerived;
    
    class CMain  
    {
    public:
    	CDerived *m_pDerived;
    public:
    	CMain();
    	virtual ~CMain();
    };
    

    Ich hoffe jetz is alles klar

    vielen dank

    ps: wenn ich unter den #includes jeweils das extra class weg tue, ändert sich gar nix.



  • JUHU!
    Nach stundenlanger Suche bin ich im Web auf diesen Satz gestoßen:
    A header file should be included only when a forward declaration would not do the job.

    Tja.. das wars...

    Class.h

    //#include "Main.h"        // das wars!!!
    class CMain;
    
    class CClass  
    {
    public:
    	void Init(CMain *pMain) { };
    
    public:
    	CClass();
    	virtual ~CClass();
    
    };
    

    trotzdem danke für die antworten...


Anmelden zum Antworten