'Incomplete Type' bei class-forward mit Unterklassen



  • Ich versuche eine Verbindung zwischen zwei Klassen herzustellen.(World und Villager)

    Villager ist eine erbende Klasse von Entity.
    Beide Klassen tauchen bei beiden deklarationen auf, wobei World ein Pointer in Villager darstellt und Villager eine richtige Instanz bei World.
    Beim gegenseitigen includieren scheint der Compiler Probleme zu haben herauszufinden , wie viel Speicher für Villager gebraucht wird.

    Fehlermeldung : " world.h|15|error: field 'ent' has incomplete type| "

    Das wars zur EInleitung, hier die konkreten Daten :

    main.cpp

    #include "Entity.h"
    #include "World.h"
    
    #include "conio.h"
    
    int main()
    {
        World s;
        s.Draw();
    
        getch();
    }
    

    World.h

    #ifndef WORLD
    #define WORLD
    
    class Villager;
    
    class World
    {
        public :
    
            World();
    
            void Draw();
    
            Villager ent;
    };
    
    #endif // WORLD
    

    World.cpp

    #include "World.h"
    #include "Villager.h"
    
    World::World()
    {
    
    }
    
    void World::Draw()
    {
        ent.Draw();
    }
    

    Entity.h

    #ifndef ENTITY
    #define ENTITY
    
    #include <iostream>
    using namespace std;
    #include <conio.h>
    
    class Entity
    {
        public :
    
            Entity(){}
    
            virtual void Draw() = 0;
    
        private :
    
        float x,y;
    
    };
    
    #endif // ENTITY
    

    Entity.cpp

    #include "Entity.h"
    
    Entity::Entity()
    {
    
    }
    

    Villager.h

    #ifndef VILLAGER
    #define VILLAGER
    
    #include "Entity.h"
    #include "world.h"
    
    class World;
    
    class Villager : public Entity
    {
        public:
            Villager();
            void Draw();
        protected:
        private:
    
            World* m_pWorld;
    };
    
    #endif // VILLAGER
    

    Villager.cpp

    #include "Villager.h"
    #include "World.h"
    
    Villager::Villager()
    {
        //ctor
    }
    
    void Villager::Draw()
    {
        cout << "Villager : \"HI\" ";
    }
    

    Die Vorgehensweise orientiert sich danach : http://www.adp-gmbh.ch/cpp/forward_decl.html

    Ich hoffe ihr könnt mir helfen : D



  • Die Fehlermeldung sagt ja eigentlich bereits wo das Problem liegt, aber wenn du verstehen willst warum das so ist und was du dagegen machen kannst siehe hier.



  • #ifndef WORLD
    #define WORLD
    
    #include "Villager.h" //Wird komplett gebraucht
    
    class World
    {
        public :
    
            World();
    
            void Draw();
    
            Villager ent;
    };
    
    #endif // WORLD
    
    #ifndef VILLAGER
    #define VILLAGER
    
    #include "Entity.h"
    
    //#include "world.h" //darf nicht, sonst wirds zyklisch
    
    class World;
    
    class Villager : public Entity
    {
        public:
            Villager();
            void Draw();
        protected:
        private:
    
            World* m_pWorld;
    };
    
    #include "World.h" //danach darf aber, das ist fein.
    
    #endif // VILLAGER
    
    #ifndef ENTITY
    #define ENTITY
    
    #include <iostream>
    using namespace std;
    #include <conio.h>
    
    class Entity
    {
        public :
    
            Entity();//hier war aus versehen {}
    
            virtual void Draw() = 0;
    
        private :
    
        float x,y;
    
    };
    
    #endif // ENTITY
    
    //#include "Entity.h" nicht menr nötig
    #include "World.h"
    
    #include "conio.h"
    
    int main()
    {
        World s;
        s.Draw();
    
        getch();
    }
    
    #include "World.h"
    //#include "Villager.h" //nicht menr nötig
    #include "Entity.h" //hübsch, weil ent.Draw() verwendet wird
    
    World::World()
    {
    
    }
    
    void World::Draw()
    {
        ent.Draw();
    }
    
    #include "Villager.h"
    //#include "World.h" //nicht mehr nötig
    
    Villager::Villager()
    {
        //ctor
    }
    
    void Villager::Draw()
    {
        cout << "Villager : \"HI\" ";
    }
    


  • Hey, danke euch beiden.
    Hat prima geklappt : D



  • drakon schrieb:

    Die Fehlermeldung sagt ja eigentlich bereits wo das Problem liegt, aber wenn du verstehen willst warum das so ist und was du dagegen machen kannst siehe hier.

    mal ganz ehrlich?
    du hast mir grad die nächsten tage gerettet...
    ich dachte man muss forward declaren UND includen

    me: <--- fail



  • Skym0sh0 schrieb:

    drakon schrieb:

    Die Fehlermeldung sagt ja eigentlich bereits wo das Problem liegt, aber wenn du verstehen willst warum das so ist und was du dagegen machen kannst siehe hier.

    mal ganz ehrlich?
    du hast mir grad die nächsten tage gerettet...
    ich dachte man muss forward declaren UND includen

    me: <--- fail

    Das ist wohl der Artikel, den bereits am meisten geholfen hat. Ich verstehe nicht warum den nur so wenig liken.. 😉



  • drakon schrieb:

    Das ist wohl der Artikel, den bereits am meisten geholfen hat. Ich verstehe nicht warum den nur so wenig liken.. 😉

    Du hast in Deiner Sig noch Platz dafür.
    Ich hatte damals leider keine Anleitung und wochenlang rumgeraten und vertagt, bevor ich es gerafft hatte.



  • drakon schrieb:

    Skym0sh0 schrieb:

    drakon schrieb:

    Die Fehlermeldung sagt ja eigentlich bereits wo das Problem liegt, aber wenn du verstehen willst warum das so ist und was du dagegen machen kannst siehe hier.

    mal ganz ehrlich?
    du hast mir grad die nächsten tage gerettet...
    ich dachte man muss forward declaren UND includen

    me: <--- fail

    Das ist wohl der Artikel, den bereits am meisten geholfen hat. Ich verstehe nicht warum den nur so wenig liken.. 😉

    😉 geändert:)


Log in to reply