似乎头文件被忽略了/继承平原不起作用

Seems like header files are being ignored/Inheritance plain not working

本文关键字:继承 不起作用 被忽略了 文件      更新时间:2023-10-16

有人可能很容易发现这里的问题,但我已经打了一个多小时了,什么都做不了。

代码:

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:语法错误:标识符"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",这对我来说很好。我个人怀疑你遗漏了一些与检测问题有关的重要细节。这些可能是

  1. 类CCD_ 13在名称空间中定义
  2. "everythingother.h"中的something定义了宏名称AISTATE_H
  3. 其他的东西

为了了解发生了什么,我将使用无所不在的-E/E编译器标志来查看预处理文件的结果。这应该显示AIStatePlayer的定义位置。

关于另一个"错误",即编译器对PieceMoved()未被重写保持沉默:您可以进一步从AIState_Generic派生并在那里定义函数。如果尝试创建类型为AIState_Generic的对象,则会出现错误。