INclude Rekursion ? base class not found



  • Hallo hier erst mal mein Code 🙂

    #ifndef PERSON_H
    #define PERSON_H
    
    #include "GlobalInclude.h"
    //#include "Team.h" hier Fehler
    
    class Person
    {
    public:
    	Person(string name, string prename, int age);
    	~Person();
    
    	string GetName() { return sName; }
    	string GetPrename() { return sPrename; }
    	int GetAge() { return iAge; }
    
    private:
    	string sName,sPrename;
    	int iAge;
    
    };
    
    #endif
    
    #ifndef PLAYER_H
    #define PLAYER_H
    
    #include "GlobalInclude.h"
    #include "Person.h"
    #include "Team.h" // Kein Fehler
    class Player : public Person
    {
    public:
    	Player(string name, string prename, int age) : Person(name, prename,age)
    	{
    	}
    	~Player();
    
    	Result SetTechnic(int index, float min, float max);
    	Result SetTechnic(int index, float value);
    
    	Result SetTactic(int index, float min, float max);
    	Result SetTactic(int index, float value);
    
    	Result SetFitness(int index, float min, float max);
    	Result SetFitness(int index, float value);
    
    private:
    	float aTechnic[iNumberAction], aFitness[iNumberFitness], aTactic[iNumberTactic]; 
    };
    
    #endif
    
    #ifndef TEAM_H
    #define TEAM_H
    
    #include "GlobalInclude.h"
    #include "Player.h"
    
    class Team
    {
    public:
    	Team(string name);
    	~Team();
    
    	string GetName() { return sName;}
    
    private:
    	string sName;
    
    };
    
    #endif
    

    Okay die Klasse person ist die Basisklasse. Wenn ich nun in person.h die datei team.h einbinden will kommt ein fehler "base class not found " in player.h. füge ich die datei "team.h" in player.h ein läuft es .

    kann mir das jemand erklären.

    vielen dank



  • Naja, wenn du in person.h team.h einbindest, wird in team.h player.h eingebunden, welche wiederum person.h einbindet.
    Da du alles schön so wies sein soll mit include guards gemacht hast, wird an der Stelle dann person.h kein zweites mal eingebunden, da das zu dem Zeitpunkt ja schon passiert ist, und damit ist dann Person auch nicht bekannt.
    Daher schafft eine forward deklaration der klasse Person in player.h abhilfe.



  • Danke für deine Erklärung. Werde das mit der Forward Deklaration gleich probieren. Macht so eine deklaration nicht generell bei includes eigener klassen sinn. denn man kann doch immer wieder auf so ein verhalten wie meins stoßen



  • Du solltest Vorwärtsdeklarationen verwenden, wenn der verwendete Typ nicht vollständig bekannt sein muss. Wenn eine Klasse Membervariablen anderer Klassen besitzt (nicht Zeiger oder Referenzen darauf) oder von diesen ableitet, muss die entsprechende Headerdatei eingebunden sein. Wenn man auf Funktionalität der Klasse zugreift, ebenfalls.

    Bereits vollständig definierte Typen nochmals zu deklarieren macht hingegen keinen Sinn.



  • crt32 schrieb:

    Daher schafft eine forward deklaration der klasse Person in player.h abhilfe.

    Garantiert nicht! Das geht nicht da Person komplett bekannt sein muss, weil Player von Person erbt. Dafür braucht man die Definition der Klasse - und Definition ist nun mal Definition und nicht Deklaration...

    Wenn man solche gegenseitigen Abhängigkeiten hat, hilft nur eins: Pointer als Member und im Header immer auf Forward Declaration setzen - wenn es geht, s.o. Include erst in der .cpp.



  • Danke habe das jetzt geändert :

    #ifndef PLAYER_H
    #define PLAYER_H
    
    #include "GlobalInclude.h"
    #include "Person.h"
    
    class Person;
    
    class Player : public Person
    {
    public:
    	Player(string name, string prename, int age) : Person(name, prename,age)
    	{
    	}
    	~Player();
    
    	Result SetTechnic(int index, float min, float max);
    	Result SetTechnic(int index, float value);
    
    	Result SetTactic(int index, float min, float max);
    	Result SetTactic(int index, float value);
    
    	Result SetFitness(int index, float min, float max);
    	Result SetFitness(int index, float value);
    
    private:
    	float aTechnic[iNumberAction], aFitness[iNumberFitness], aTactic[iNumberTactic]; 
    };
    
    #endif
    

    leider bleibt der fehler



  • Nexus schrieb:

    Bereits vollständig definierte Typen nochmals zu deklarieren macht hingegen keinen Sinn.

    Also tu es nicht!

    Wie sieht "person.h" momentan aus? Ist der Fehler noch exakt derselbe?

    Ausserdem: Halte dich an die Regel der Grossen Drei (Kopierkonstruktor, Zuweisungsoperator und Destruktor jeweils zusammen oder gar nicht selbst implementieren).



  • Ich habe jetzt eins gemacht in der Klasse team den include player wieder rausgenommen und statt dessen eine forward deklaration auf player gemscht und es geht.

    ist das eine lösung


Anmelden zum Antworten