目前正在设计一款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是罪魁祸首。
答案 0 :(得分:4)
不,XCode不是罪魁祸首。你有圆形头依赖关系不是XCode的错。
根据您发布的编译器转储,您的StudentWorld.h
标头文件的#include包含HardProtester.h
。
这是经典循环标头依赖的情况。
首先,您要包括Protester.h
。
在Protester.h
获得Protester
类定义之前,它的#include
为StudentWorld.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之间有一个循环依赖
尝试修复它并查看它是否有帮助。