类之间的 TypeDef 错误C++

TypeDef error between classes C++

本文关键字:错误 C++ TypeDef 之间      更新时间:2023-10-16

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

我有 2 个职业敌人.cpp和 AI.cpp。 我的AI.cpp需要来自敌人的值.cpp以便能够处理其移动等。 在AI中.cpp我持有指向位置,速度和敌人面对方向的枚举等值的指针。

下面列出了我收到的错误。如果有更简单的方法可以在类之间链接枚举变量,请 im all ears。

下面是该错误的工作示例。

///////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": 不是类或命名空间名称 示例类型定义错误 c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 11

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

严重性代码描述项目文件行 错误 C3646 'mFacing': 未知覆盖说明符 示例类型定义错误 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 个参数 示例类型定义错误 c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\enemy.cpp 7

严重性代码描述项目文件行 错误 C2061 语法错误: 标识符"此面向" 示例类型定义错误 c:\dev\projects\exampleoftypedeferror\exampleoftypedeferror\ai.h 13

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

在这里使用包含保护实际上没有帮助,因为Enemy.h取决于AI.h,这取决于Enemy.h等等。

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

如果你仔细观察Enemy.h头文件,它对AI类的所有用途都是声明一个成员变量,它是一个指向AI的指针。这意味着你不需要AI的完整定义,你只需要告诉编译器类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",因为那里需要类的完整定义。

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

另请注意,我将标头保护宏更改为没有前导下划线,因为所有带有大写字母的前导下划线后跟符的符号都在所有范围内保留。例如,请参阅此问题及其答案以获取更多详细信息。