类 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了解更多详情。
我是一个相当新的程序员,所以我可能没有正确理解 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了解更多详情。