似乎头文件被忽略了/继承平原不起作用
Seems like header files are being ignored/Inheritance plain not working
有人可能很容易发现这里的问题,但我已经打了一个多小时了,什么都做不了。
代码:
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
:得到两个错误
- 错误C2504:"AIState":基类未定义
- 错误C2061:语法错误:标识符"Player"
我认为,包括一个其内容只不过是AIState
定义的头可以阻止第一个错误,对吧?第二个错误也不应该发生(Player
是在"其他一切"标头中定义的),将该标头放在AIState_Generic.h
中不会改变任何内容。转发声明没有任何作用。
我甚至尝试将整个AIState
类复制到AIState_Generic.h
中,但这仍然没有修复错误2,更糟糕的是,没有出现不实现纯虚拟函数PieceMoved()
的错误。
编辑:这两个文件是唯一可能出现问题的文件;剩下的是功能遗留代码。该项目在VS2008中。
将include
s移动到ifndef
s之外会增加"不知道"Player"错误出现的次数,此外还会产生新的错误:
error C2660: 'AIState::Move' : function does not take 1 arguments
尽管它如此明目张胆。然而,它似乎确实修复了继承,因为它会产生关于不重写纯虚拟函数的错误。
我猜其他所有.h中都包含文件AIState_Generic.h,因为现在AIState_h被定义为AIState.h的内容,当它包含在AIState_Generic.h中时,它被#ifndef保护排除。
在我看来,其他一切.h都应该在#ifndef之外(但有自己的头保护以防止多次编译)
尝试这两个文件,并声明Player
来代替丢失的"everythingother.h",这对我来说很好。我个人怀疑你遗漏了一些与检测问题有关的重要细节。这些可能是
- 类CCD_ 13在名称空间中定义
- "everythingother.h"中的something定义了宏名称
AISTATE_H
- 其他的东西
为了了解发生了什么,我将使用无所不在的-E
或/E
编译器标志来查看预处理文件的结果。这应该显示AIState
和Player
的定义位置。
关于另一个"错误",即编译器对PieceMoved()
未被重写保持沉默:您可以进一步从AIState_Generic
派生并在那里定义函数。如果尝试创建类型为AIState_Generic
的对象,则会出现错误。
- 为什么在保护模式下继承升级不起作用
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 带有此指针的模板类多重继承构造函数不起作用?
- 我的二传手在新类中不起作用(继承)
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 为什么多个头文件和源文件中的C++继承不起作用?
- C++ 多级继承不起作用
- C++,继承的复制因子不起作用
- C++为什么继承不起作用
- 在C++中实现方法时继承不起作用
- .cpp.模板类继承不起作用
- 似乎头文件被忽略了/继承平原不起作用
- C++继承在堆栈上不起作用
- 使用继承时,带有 CRTP 的类型定义不起作用
- 类继承代码不起作用
- C++11构造函数继承不起作用
- c++中的继承不起作用.编译以下c++代码时发生链接器错误
- 使用模板时,继承不起作用
- 派生类的继承方法不起作用
- 具有继承的重载方法/运算符不起作用