2014-07-13 6 views
5

Ich habe diesen Fehler viele Male zuvor gefunden und fand schließlich Lösungen, aber diese hat mich ratlos. Ich habe eine Klasse 'Mob', die von der Klasse 'Player' geerbt wird. Dies ist Mob.h:Fehler C2504: Basisklasse undefined

#pragma once 
#include "PlayState.h" 
#include "OmiGame/OmiGame.h" 
#include "resources.h" 

class PlayState; 

class Mob 
{ 
private: 
    int frames; 
    int width; 
    int height; 
    int time; 

    sf::Texture textureL; 
    sf::Texture textureR; 
    Animation animationL; 
    Animation animationR; 
    AnimatedSprite sprite; 
    bool moveLeft; 
    bool moveRight; 
    bool facingRight; 

public: 
    void createMob(std::string l, std::string r, int frames, int width, int height, int time, int x, int y); 

    void updateMob(omi::Game *game, PlayState *state); 
    void drawMob(sf::RenderTarget &target); 

    void setLeft(bool b) { moveLeft = b; } 
    void setRight(bool b) { moveRight = b; } 
    bool isLeft() { return moveLeft; } 
    bool isRight() { return moveRight; } 

    sf::Vector2f getPosition() { return sprite.getPosition(); } 
}; 

Dies ist Player.h, ab jetzt ist es extrem einfach:

#pragma once 
#include "OmiGame/OmiGame.h" 
#include "PlayState.h" 
#include "Mob.h" 
#include "resources.h" 

class PlayState; 
class Mob; 

const int playerFrames = 8; 
const int playerWidth = 16; 
const int playerHeight = 48; 
const int playerTime = 50; 
const int playerX = 200; 
const int playerY = 200; 

class Player : public Mob 
{ //the error occurs at this line// 
public: 
    Player(); 
    void update(omi::Game *game, PlayState *state); 
    void draw(sf::RenderTarget &target); 
}; 

Und wie Sie wahrscheinlich erraten kann, ist dies der Fehler ist:

error C2504: 'Mob' : base class undefined player.h 

Ich habe nach vorne erklärt Mob, ich habe hoffentlich keine kreisförmigen Abhängigkeiten behoben. Kann mir bitte jemand helfen?

+0

Sind die Dateien im selben Verzeichnis? – ChiefTwoPencils

+0

Sie wissen, dass es die Kapselung irgendwie verhindert, wenn Sie Accessoren für alle Ihre privaten Mitglieder bereitstellen ... – Deduplicator

+1

@Deduplicator Tut es nicht. Nur vier private Mitglieder haben Zugriffsmechanismen, weil Mobs darauf basierend unterschiedlich reagieren müssen, aber sie müssen diese Mitglieder teilen, damit der wiederverwendete Code auch auf sie zugreifen kann. –

Antwort

17

Vorwärts Deklaration hilft nicht für class Player : public Mob, weil der Compiler die vollständige Definition für die Vererbung benötigt.

Wahrscheinlich bringt einer Ihrer Includes in Mob.h Player.h, was Player dann vor Mob versetzt und somit den Fehler auslöst.

+0

Das Entfernen von '#include" PlayState.h "hat funktioniert. PlayState deklariert Player, aber Player deklariert PlayState auch so, dass die Zeile nicht benötigt wird. Vielen Dank. –

6

Ich habe durch das ähnliche Problem, und ich Lösung aus und es eine Faustregel für mich gemacht

Lösung/Daumen-Regel

//File - Foo.h 
#include "Child.h" 
class Foo 
{ 
//Do nothing 
}; 

//File - Parent.h 
#include "Child.h" // wrong 
#include "Foo.h" // wrong because this indirectly 
        //contain "Child.h" (That is what is your condition) 
class Parent 
{ 
//Do nothing 
Child ChildObj ; //one piece of advice try avoiding the object of child in parent 
        //and if you want to do then there are diff way to achieve it 
}; 

//File - Child.h 
#include "Parent.h" 
class Child::public Parent 
{ 
//Do nothing 
}; 

Sie das Kind in Elternklasse nicht enthalten.

wenn Sie den Weg wissen wollen, in einer übergeordneten Klasse ein untergeordnetes Objekt haben die verweisen auf den Link Alternative

Danke

1

Ich weiß, dass dies nicht der beste Weg ist, mit diesem Problem fertig zu werden, aber es funktioniert zumindest für mich. Sie können alle anderen Includes in die cpp-Datei einfügen:

#include "OmiGame/OmiGame.h" 
#include "PlayState.h" 
#include "Mob.h" 
#include "resources.h"