有人可能很容易在这里发现这个问题,但是我已经打了一个多小时了,但却找不到工作。
代码:
AIState.h
#ifndef AISTATE_H
#define AISTATE_H
#include "everythingelse.h"
class AIState {
public:
virtual void PieceMoved() = 0;
virtual void Move(Player &player) = 0;
};
#endif
AIState_Generic.h
#ifndef AISTATE_GENERIC_H
#define AISTATE_GENERIC_H
#include "AIState.h"
class AIState_Generic : public AIState {
public:
virtual void Move(Player &player);
};
#endif
我从AIState_Generic.h
收到两个错误:
我认为包含一个内容只是AIState
定义的标题会阻止第一个错误,对吗?第二个错误也不应该发生(Player
在“其他所有”标题中定义),并且将该标题放在AIState_Generic.h
中并不会改变任何内容。前瞻性声明什么都不做。
我甚至尝试将整个AIState
类复制到AIState_Generic.h
,但仍然没有修复错误2 - 更糟糕的是,没有实现纯虚函数{{1}的错误}}
编辑:这两个文件是唯一可能出现问题的文件;其余的是功能遗留代码。该项目在VS2008。
将PieceMoved()
移到include
之外会增加出现“不知道”播放器“”错误的次数,此外还会产生新的错误:
ifndef
......尽管它确实令人难以置信地显而易见。然而,它似乎修复了继承,因为它产生了不覆盖纯虚函数的错误。
答案 0 :(得分:2)
我猜想everythingelse.h中包含文件AIState_Generic.h - 因为现在AISTATE_H被定义为AIState.h中的内容,当它被包含在AIState_generic.h中时被#ifndef后卫排除。
在我看来,everythingelse.h应该在#ifndef之外(但是它有自己的标题防范以防止多次编译)
答案 1 :(得分:1)
尝试这两个文件并声明Player
代替缺少的“everythingelse.h”,它编译好我。我个人怀疑你遗漏了一些与检测问题有关的重要细节。这些可能是
AIState
在名称空间AISTATE_H
要查看发生了什么,我会使用无所不在的-E
或/E
编译器标志来查看预处理文件的结果。这应该显示AIState
和Player
的定义位置。
关于另一个“错误”,即编译器对PieceMoved()
没有被覆盖的沉默这一事实是期望的:你可以进一步派生自AIState_Generic
并在那里定义函数。如果您尝试创建AIState_Generic
类型的对象,则会收到错误。