错误C2504:基类未定义

时间:2014-07-13 17:25:36

标签: c++ class inheritance header

我之前多次遇到过这个错误并最终找到了解决方案,但这个让我感到难过。我有一个班级' Mob'这是由班级' Player'继承的。这是Mob.h:

#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(); }
};

这是Player.h,截至目前它非常简单:

#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);
};

而且,正如你可能猜到的那样,这就是错误:

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

我有前锋宣布的暴徒,我希望修复任何循环依赖。请有人帮帮我吗?

3 个答案:

答案 0 :(得分:23)

前向声明对class Player : public Mob没有帮助,因为编译器需要完整的继承定义。

所以很可能你在Mob.h中的一个包含引入了Player.h,然后将Player放在Mob之前,从而触发错误。

答案 1 :(得分:8)

我遇到了类似的问题,我解决了问题,并为我制定了拇指规则

解决方案/拇指规则

//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 
};

不要将孩子包括在父类中。

如果您想知道在父类中拥有子对象的方法,请参阅链接Alternative

谢谢

答案 2 :(得分:1)

我知道这不是处理这个问题的最佳方法,但它至少对我有用。你可以将所有其他包含放在cpp文件中:

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