看起来像头文件被忽略/继承普通无法正常工作

时间:2012-02-09 19:31:57

标签: c++ inheritance

有人可能很容易在这里发现这个问题,但是我已经打了一个多小时了,但却找不到工作。

代码:

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收到两个错误:

  1. 错误C2504:'AIState':基类未定义
  2. 错误C2061:语法错误:标识符'播放器'
  3. 我认为包含一个内容只是AIState定义的标题会阻止第一个错误,对吗?第二个错误也不应该发生(Player在“其他所有”标题中定义),并且将该标题放在AIState_Generic.h中并不会改变任何内容。前瞻性声明什么都不做。

    我甚至尝试将整个AIState类复制到AIState_Generic.h,但仍然没有修复错误2 - 更糟糕的是,没有实现纯虚函数{{1}的错误}}

    编辑:这两个文件是唯一可能出现问题的文件;其余的是功能遗留代码。该项目在VS2008。

    PieceMoved()移到include之外会增加出现“不知道”播放器“”错误的次数,此外还会产生新的错误:

    ifndef

    ......尽管它确实令人难以置信地显而易见。然而,它似乎修复了继承,因为它产生了不覆盖纯虚函数的错误。

2 个答案:

答案 0 :(得分:2)

我猜想everythingelse.h中包含文件AIState_Generic.h - 因为现在AISTATE_H被定义为AIState.h中的内容,当它被包含在AIState_generic.h中时被#ifndef后卫排除。

在我看来,everythingelse.h应该在#ifndef之外(但是它有自己的标题防范以防止多次编译)

答案 1 :(得分:1)

尝试这两个文件并声明Player代替缺少的“everythingelse.h”,它编译好我。我个人怀疑你遗漏了一些与检测问题有关的重要细节。这些可能是

  1. AIState在名称空间
  2. 中定义
  3. “everythingelse.h”中的内容定义了宏名称AISTATE_H
  4. 别的东西
  5. 要查看发生了什么,我会使用无所不在的-E/E编译器标志来查看预处理文件的结果。这应该显示AIStatePlayer的定义位置。

    关于另一个“错误”,即编译器对PieceMoved()没有被覆盖的沉默这一事实是期望的:你可以进一步派生自AIState_Generic并在那里定义函数。如果您尝试创建AIState_Generic类型的对象,则会收到错误。