类 C++ 之间的 TypeDef 错误

TypeDef error between classes C++

我是一个相当新的程序员,所以我可能没有正确理解 typedef。

我有 2 classes Enemy.cpp 和 AI.cpp。 我的 AI.cpp 需要来自 Enemy.cpp 的值才能处理它的移动等。在 AI.cpp 中,我持有指向诸如位置、速度和敌人所面对方向的枚举等值的指针。

我得到的错误如下所列。如果有更简单的方法 link class 之间的枚举变量,我洗耳恭听。

下面是错误的工作示例。

///////MAIN.H/////////////

#ifndef  _MAIN_H_
#define _MAIN_H_



#endif // ! _MAIN_H_

///////////////////////////

////////MAIN.CPP///////////

#include "AI.h"
#include "Enemy.h"

int main(int argc, char* args[])
{
    Enemy enemy; 

}

//////////////////////////////

//////////ENEMY.H///////////////

#ifndef _ENEMY_H_
#define _ENEMY_H_ 

#include "AI.h"

class Enemy 
{

public: 

    Enemy();

    enum Facing
    {
        LEFT = 0,
        RIGHT
    };



protected:

    AI* EnemiesAI; 
    //try this as a pointer
    Facing EnemyDirection;

};


#endif

//////////////////////////////////

///////////ENEMY.CPP////////////////

#include "Enemy.h"

Enemy::Enemy()
{
    EnemiesAI = new AI; 

    EnemiesAI->LinkEnemyToAI(&EnemyDirection);
}

////////////////////////////////////

/////////////////AI.H//////////////

#ifndef _AI_H_
#define _AI_H_

#include "Enemy.h"

class AI
{
public: 

    /*this needs to be a pointer, otherwise I have to pass the 
    value into AI on every update*/
    typedef Enemy::Facing *ThisFacing; //Error 3

    void LinkEnemyToAI(ThisFacing facing);

private: 
    //This is a pointer to a Enemy::Facing object
    ThisFacing mFacing; 


};

#endif

///////////////////////////////////////

////////////////AI.CPP/////////////////

#include "AI.h"

void AI::LinkEnemyToAI(ThisFacing facing)
{
    mFacing = facing;
}

////////////////////////////////////////

错误 C2653 'Enemy':不是 class 或命名空间名称 ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 11

严重性代码描述项目文件行 错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 11

严重性代码描述项目文件行 错误 C3646 'mFacing':未知的覆盖说明符 ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 17

严重性代码描述项目文件行 错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 17

严重性代码描述项目文件行 错误 C2660 'AI::LinkEnemyToAI':函数不接受 1 个参数 ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\enemy.cpp 7

严重性代码描述项目文件行 错误 C2061 语法错误:标识符 'ThisFacing' ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 13

严重性代码描述项目文件行 错误 C2238 在“;”之前出​​现意外标记ExampleOfTypeDefError c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\enemy.h 23

在这里使用 include-guards 并没有什么帮助,因为 Enemy.h 依赖于 AI.h,而 AI.h 又依赖于 Enemy.h 等等。

你必须打破这个链条,打破它的最简单方法是通过一种叫做 前向声明.

的东西

如果你仔细观察 Enemy.h header 文件,它对 AI class 的所有使用是声明一个成员变量,它是指向 AI。这意味着你不需要 AI 的完整定义,你只需要告诉编译器 class AI 存在。像

#ifndef ENEMY_H
#define ENEMY_H

class AI;  // Forward declaration of the AI class    

class Enemy 
{
public: 
    Enemy();

    enum Facing
    {
        LEFT = 0,
        RIGHT
    };

protected:
    AI* EnemiesAI; 
    //try this as a pointer
    Facing EnemyDirection;
};

#endif // ENEMY_H

现在在 Enemy.cpp 文件中您仍然需要 #include "AI.h" 因为那里需要 class 的完整定义。

这个前向声明在 AI.h header 文件中是不可能的,因为你在其中使用了枚举 Enemy::Facing。但是,由于 Enemy.h 不再包含 AI.h,因此不再存在循环依赖。

另请注意,我将 header 保护宏更改为没有前导下划线,因为所有带有 upper-case 字母后跟前导下划线的符号在所有范围内都是保留的。参见例如this question and its answers了解更多详情。