"预期的班级名称"继承错误

时间:2016-02-25 00:27:43

标签: c++ xcode oop inheritance compiler-errors

问题

目前正在设计一款GUI游戏,我已经完成了游戏的基本OOP方面(以及90%的非抽象类)。但是,我尝试将一个名为Protester的类扩展到此类,该类在第5行导致错误:

#ifndef HardcoreProtester_h
#define HardcoreProtester_h
#include "Protester.h"

class HardcoreProtester : public Protester{
public:
    HardcoreProtester(StudentWorld* w, int x, int y) : Protester(w, x, y, IID_HARD_CORE_PROTESTER, 20){};
private:
};

#endif /* HardcoreProtester_h */

从此

延伸
#ifndef Protester_h
#define Protester_h
#include "Actor.h"
#include "StudentWorld.h"

class Protester : public Human{
static const int INIT_PERP_TICK = 200;
static const int DAMAGE = 20;
static const int SHOUT_WAIT = 25;
static const int MIN_STEP = 8;
static const int MAX_STEP = 60;
static const int EXIT_X = 60;
static const int EXIT_Y = 60;
public:
    static const int INIT_HITPOINTS = 5;
    Protester(StudentWorld* w, int startX, int startY, int ID, int hp);
    virtual ~Protester();
    virtual void doSomething();
    Direction pickRandomDirection();
    virtual bool changeState(Direction dir);
    virtual bool isDead() const{
        return Human::isDead() && getX() == 60 && getY() == 60;
    }
    virtual bool isDeadState() const{
        return Human::isDead();
    }
    virtual void consume();
    virtual void setDead();
    virtual bool moveDelta(StudentWorld* world, Direction dir, int& xdir, int& ydir, int steps = 1);
    int determineRandomSteps();
    bool canTurn(Actor::Direction dir);
    Actor::Direction randTurn(Actor::Direction dir);
    Actor::Direction oppositeDir(Actor::Direction dir);
    Actor::Direction numToDir(int num);

private:
    int step;
    int restTick;
    int shoutTick;
    int perpTick;
};
#endif /* Protester_h */

我已经查看了堆栈溢出,以找出错误持续存在的原因,并且我试图打破不存在的循环依赖关系(因为你可以看到Protester甚至不包括HardcoreProtester)。我试图通过添加

来打破任何循环依赖
class Protester;

高于HardcoreProtester的定义。 但是,这给了我错误:

Type 'Protester' is not a direct or virtual base of 'HardcoreProtester'

Base class has incomplete type

我还确保基类不是抽象的(我能够初始化它而没有任何错误)。

如果这不是足够的信息,那么这里是项目的github: https://github.com/OneRaynyDay/FrackMan

我为我的问题中的任何歧义道歉 - 我只是不知道错误可能在哪里(因此尝试使用github链接的MCVE)。提前谢谢!

编辑:另外,使用XCode制作这个项目。在这一点上进行调试我开始怀疑XCode是罪魁祸首。

此外,为了更加有用和可验证,这里是XCode的错误诊断图片: enter image description here

2 个答案:

答案 0 :(得分:4)

不,XCode不是罪魁祸首。你有圆形头依赖关系不是XCode的错。

根据您发布的编译器转储,您的StudentWorld.h标头文件的#include包含HardProtester.h

这是经典循环标头依赖的情况。

首先,您要包括Protester.h

Protester.h获得Protester类定义之前,它的#includeStudentWorld.h

根据编译器的错误诊断,

StudentWorld.h的#include必须为HardProtester.h

现在,您的HardProtester.h拥有自己Protester.h的内容。但是,因为已经设置了ifndef / define guard,所以在Protester.h的第一个包含中,此头文件的第二个#include将变为空文本。

现在,在返回HardProtester.h时,您尝试声明它是类。

现在,如果你一直在仔细注意,你应该已经发现Protester类还没有被声明,但是这个头文件试图声明它的子类。

有你的问题。您需要完全重构头文件彼此依赖的方式,以消除此循环依赖关系。仅仅在HardProtester.h中坚持“阶级抗议者”是不够的。在声明任何子类之前,必须定义整个类,而不仅仅是声明它。

答案 1 :(得分:1)

你在Protester.h和StudentWorld.h之间有一个循环依赖

尝试修复它并查看它是否有帮助。