Ein Problem mit Klassen...



  • Hallo zusammen!

    Ich habe da so ein Problem...
    Ich wüsste nicht, wonach ich hier oder bei Google suchen sollte, deshalb dieser Thread.

    Um mein Problem besser beschreiben zu können, erstmal meine Situation:
    Ich habe folgendes Klassengebilde (einfaches Beispiel, dass auf meine Situation jedoch genau zutrifft):

    //=== Animal.h ===
    #if !defined(ANIMAL_H_)
    #define ANIMAL_H_
    
    class CAnimal
    {
    private:
    	char id[0x20];
    public:
    	CAnimal(char* ID){SetID(ID);};
    	virtual ~CAnimal();
    
    	virtual void SetID(char* ID);
    	virtual char* ID(){return id;};
    
    	virtual char* WhatAmI(){return "Animal";};
    };
    
    #endif
    
    //=== Insect.h ===
    #if !defined(INSECT_H_)
    #define INSECT_H_
    
    #include "Animal.h"
    class CInsect:public CAnimal
    {
    public:
    	CInsect(char* ID){CAnimal::SetID(ID);};
    	virtual ~CInsect();
    
    	virtual char* WhatAmI(){return "An insect";};
    };
    
    #endif
    
    //=== Ant.h ==
    #if !defined(ANT_H_)
    #define ANT_H_
    
    #include "Insect.h"
    class CAnt:public CInsect
    {
    public:
    	CAnt(char* ID){CInsect::SetID(ID);};
    	virtual ~CAnt();
    
    	virtual char* WhatAmI(){return "An ant";};
    };
    
    #endif
    

    Folgende Struktur soll alle "Ameisen" (CAnt), die im Programm kontruiert werden, auflisten (wobei jede ihre individuelle ID (siehe CAnimal) hat, um später identifiziert werden zu können):

    //List.h
    #if !defined(LIST_H_)
    #define LIST_H_
    
    #include <vector>
    using namespace std
    
    #include "Ant.h"
    struct TList
    {
    	vector<CAnt*> ants;
    };
    
    CAnt* FindAnt(TList* List,char* ID);	//findet in einer TList die Ameise mit der gegebenen ID, gibt NULL zurück falls nicht gefunden
    
    #endif
    

    Mein Problem ist nun folgendes:

    Angenommen, in CAnt sei noch (als private)

    CAnt* BestFriend
    

    und es solle eine Funktion geben, die einer Ameise ihre beste Freundin via ID zuweist. Das stelle ich mir so vor:

    void CAnt::MakeBestFriend(char* ID,TList* List)
    {
    	BestFriend = FindAnt(List,ID);
    }
    

    Ich muss also "List.h" in "Ant.h" einbeziehen (#include "List.h"), was jedoch jede Menge Fehler verursacht, die ich mir leider nicht wirklich erklären kann...

    Es ist übrigens notwendig (glaube ich...), dass als Argumente von MakeBestFriend eine ID und ein Pointer zu einer TList übergeben wird, da die Ameisenliste aus einer INI-Datei geladen wird.

    Gibt es hier eine Lösung zu oder muss ich dieses Konzept umwerfen?

    Danke im Voraus! 🙂
    -DrKrake



  • Poste mal die Fehlermeldungen.
    Hast du Namenskonflikte?



  • OK, hier sind die Fehlermeldungen, die erscheinen, wenn ich "List.h" in "Ant.h" einbeziehe:

    MSVC++ 6.0 schrieb:

    --------------------Konfiguration: TestKlassen - Win32 Debug--------------------
    Kompilierung läuft...
    Main.cpp
    d:\cpp\testklassen\list.h(12) : error C2065: 'CAnt' : nichtdeklarierter Bezeichner
    d:\cpp\testklassen\list.h(12) : error C2059: Syntaxfehler : '>'
    d:\cpp\testklassen\list.h(13) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
    d:\cpp\testklassen\list.h(15) : error C2146: Syntaxfehler : Fehlendes ',' vor Bezeichner 'ID'
    d:\cpp\testklassen\list.h(15) : error C2065: 'ID' : nichtdeklarierter Bezeichner
    d:\cpp\testklassen\list.h(15) : error C2143: Syntaxfehler : Fehlendes ',' vor ')'
    d:\cpp\testklassen\ant.h(9) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
    d:\cpp\testklassen\ant.h(11) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
    d:\cpp\testklassen\ant.h(12) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
    d:\cpp\testklassen\ant.h(14) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
    d:\cpp\testklassen\ant.h(15) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
    d:\cpp\testklassen\main.cpp(4) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
    d:\cpp\testklassen\main.cpp(11) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
    d:\cpp\testklassen\main.cpp(12) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
    d:\cpp\testklassen\main.cpp(12) : fatal error C1001: INTERNER COMPILER- FEHLER
    (Compiler-Datei "YÃ", Zeile 1)
    Bitte wählen Sie im Menü "?" von Visual C++
    den Befehl "Software Service", oder öffnen Sie die Hilfedatei für den Software Service, um weitere Informationen zu erhalten
    Fehler beim Ausführen von cl.exe.

    TestKlassen.exe - 15 Fehler, 0 Warnung(en)

    Beziehe ich sie in "Animal.h" (die Basisklasse) ein, was wesentlich nützlicher wäre, erscheint folgende Meldung:

    MSVC++ 6.0 schrieb:

    --------------------Konfiguration: TestKlassen - Win32 Debug--------------------
    Kompilierung läuft...
    Main.cpp
    d:\cpp\testklassen\insect.h(7) : error C2504: 'CAnimal' : Basisklasse undefiniert
    d:\cpp\testklassen\main.cpp(6) : error C2039: 'SetID' : Ist kein Element von 'CAnt'
    d:\cpp\testklassen\ant.h(6) : Siehe Deklaration von 'CAnt'
    Fehler beim Ausführen von cl.exe.

    TestKlassen.exe - 2 Fehler, 0 Warnung(en)



  • Ich entschuldige den Double-Post, aber das Problem ist gelöst.
    Das Stichwort ist "forward declaration"...

    Unmittelbar vor der Deklaration von "TList" deklariere ich "class CAnt;".
    In CAnt kann ich nun ohne Probleme "List.h" einbeziehen.


Anmelden zum Antworten