我是一个相当新的程序员,所以我可能无法正确理解typedef。
我有两个类Enemy.cpp和AI.cpp。 我的AI.cpp需要来自Enemy.cpp的值才能处理它的移动等。在AI.cpp中,我持有指向诸如位置,速度和敌人面向方向的枚举等值的指针。
我得到的错误列在下面。如果有一种更简单的方法可以在类之间链接枚举变量,那么我将全力以赴。
下面的是错误的一个工作示例。
///////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':不是类或命名空间名称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
答案 0 :(得分:0)
在这里使用包含警卫确实无济于事,因为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
,因此不再存在循环依赖。
另请注意,我将标头保护宏更改为不具有前导下划线,因为所有范围内都保留带有大写字母的前导下划线跟随符号的所有符号。参见例如this question and its answers了解更多详情。