Basisklasse undefiniert



  • Hallo,
    ich habe schon ziemlich lange gesucht, doch keine Antwort gefunden, die mir geholfen hat. Aber ich habe hier einen Fehler, der nicht da sein sollte:

    error C2504: 'npc_base': Basisklasse undefiniert

    Hier mal die Dateien, bis aufs wichtigste gekürzt:

    Basisklasse (npc.h):

    #ifndef NPC_H
    #define NPC_H
    
    #include <SFML\Graphics.hpp>
    #include "core\include\game.h"
    #include "manager\include\Resource.h"
    #include "player\include\player.h"
    
    class Game;
    class player;
    
    class npc_base
    {
    protected:
    	virtual void Update(Game &game, player &Player);
    	virtual void Render(sf::RenderWindow &App);
    	virtual void setSpawnPoint(sf::Vector2f point);
    	virtual void animation();
    	virtual sf::Sprite getSprite();
    
    protected:
    //variablen, wie Geschwindigkeit, HP und so weiter
    
    };
    
    #endif
    

    npc_dragon.h

    #ifndef NPC_DRAGON_H
    #define NPC_DRAGON_H
    
    #include "npc.h"
    
    class Game;
    class player;
    
    class npc_dragon : protected npc_base
    {
    public:
    	npc_dragon();
    	~npc_dragon();
    
    	void Update(Game &game, player &Player) override;
    	void Render(sf::RenderWindow &App) override;
    	void setSpawnPoint(sf::Vector2f point) override;
    	void animation() override;
    	sf::Sprite getSprite() override;
    
    private:
    
    };
    
    #endif
    

    npc_dragon.cpp:

    #include "include\npc_dragon.h"
    
    npc_dragon::npc_dragon()
    {
    //Initialisierung
    }
    
    void npc_dragon::Update(Game &game, player &Player)
    {
    //KI & Bewegung
    }
    
    void npc_dragon::animation()
    {
    //Animation
    }
    
    void npc_dragon::Render(sf::RenderWindow &App)
    {
    
    }
    
    sf::Sprite npc_dragon::getSprite()
    {
    
    }
    
    void npc_dragon::setSpawnPoint(sf::Vector2f point)
    {
    
    }
    
    npc_dragon::~npc_dragon()
    {
    }
    

    Das ganze gibt es noch mal in einer anderen Klasse, da da aber alles gleich ist, habe ich die mal nicht mit rein genommen.

    Das ist die Codestruktur, die ich auch sonst über all verwende, nur hier funktioniert es nicht. Der Fehler ist wahrscheinlich offensichtlich, aber ich scheine blind zu sein 😞

    Ich hoffe, mir kann da jemand helfen, der nicht wieder rumflamed, dass ich das doch bei google finden könnte, das habe ich gemacht und nichts gefunden!

    lg,
    Hegad

    PS: Ich verwende die SFML für die Grafik, also nicht über den "sf"-Namespace wundern 😉



  • Vermutung: in game, Resource oder player wird npc_dragon eingebunden und npc vorwärts deklariert.



  • manni66 schrieb:

    Vermutung: in game, Resource oder player wird npc_dragon eingebunden und npc vorwärts deklariert.

    Habe ich gerade noch einmal nachgeguckt, aber in den Dateien, die ich eingebunden habe nutze ich die npc_dragon gar nicht 😕 Nur in einer Klasse (playstate), da habe ich aber alles richtig eingebunden



  • Du wirst trotzdem eine Kreuzreferenz (cross include) haben (wenn auch indirekt, d.h. über mehrere Include-Dateien).

    Wird 'playstate' von game.h, resource.h oder player.h eingebunden?



  • Pack mal in alle fraglichen include Files ein #pragma message rein.
    Dann kannst du nachvollziehen in welcher Reihenfolge die inkludiert werden.

    ps: Ansonsten kannst du mal gucken ob es einen Compiler-Switch gibt, der dafür sorgt dass bei jedem #include eine Nachricht ausgegeben wird und/oder das fertig "vorbearbeitete" File (also nachdem der Präprozessor gelaufen ist) abgespeichert wird.



  • Ich habe noch mal etwas rumprobiert und bemerkt, dass alles wunderbar compiliert wird, wenn ich die 2. Klasse, die von npc_base erbt komplett auskommentiere. Wenn diese aber drin ist, kommt der Fehler, dass npc_base bei npc_dragon nicht definiert ist 😕

    hier noch mal die besagte 2. Klasse:

    #ifndef NPC_SHEEP_H
    #define NPC_SHEEP_H
    
    #include "npc.h"
    
    class Game;
    class player;
    
    class npc_sheep : protected npc_base
    {
    public:
    	npc_sheep();
    	~npc_sheep();
    
    	void Update(Game &game, player &Player) override;
    	void Render(sf::RenderWindow &App) override;
    	void setSpawnPoint(sf::Vector2f point) override;
    	void animation() override;
    	sf::Sprite getSprite() override;
    
    private:
    
    };
    
    #endif
    


  • Hast du mal den Tipp von hustbaer ausprobiert?

    PS: Du solltest deine Klassen- und Variablennamen einheitlich gestalten, d.h. entweder immer mit Großbuchstaben am Anfang (bei den Klassen) oder generell Kleinbuchstaben: Game <-> player.
    Gleiches gilt dann auch für deine Klassenfunktionen.



  • hustbaer schrieb:

    Pack mal in alle fraglichen include Files ein #pragma message rein.
    Dann kannst du nachvollziehen in welcher Reihenfolge die inkludiert werden.

    ps: Ansonsten kannst du mal gucken ob es einen Compiler-Switch gibt, der dafür sorgt dass bei jedem #include eine Nachricht ausgegeben wird und/oder das fertig "vorbearbeitete" File (also nachdem der Präprozessor gelaufen ist) abgespeichert wird.

    Ich habe das mal ausprobiert:
    er deklariert tatsächlich erst die abgeleiteten Klassen von npc_base, also npc_dragon. Das scheint aber kein Problem darzustellen, wenn nur einmal von der npc_base-Klasse abgeleitet wird, denn dann geht alles wunderbar. Wenn ich aber npc_sheep wieder "aktiviere" (hatte vorher zum Test diese Klasse komplett auskommentiert), dann kommt ein Fehler.

    Ausgegebene Reihenfolge:
    npc_sheep
    npc_base
    npc_dragon



  • Hegad schrieb:

    er deklariert tatsächlich erst die abgeleiteten Klassen

    Nicht er, sondern du. Du wirst wohl nicht drumherum kommen, nochmal genau hinzuschauen.



  • Ok! Habe eine Lösung gefunden:

    ich habe npc_dragon und npc_sheep jetzt nicht in der Haederdatei von meinem Playstate sondern in dessen .cpp inkludiert.

    Trotzdem danke für die ganzen Antworten, es hat schon einen Grund, warum ich in diesem Forum und nicht in einem anderen bin 🙂


Anmelden zum Antworten