错误2061 - 当我包含标题时,类变成“未定义”
问题描述:
这非常奇怪,我无法理解它是什么导致它发生的......因此,我有两个类:Player and Enemy和一个实用程序static类CollisionMgr。错误2061 - 当我包含标题时,类变成“未定义”
我有一个世界级的敌人数组,我想在Player类中有一个指向它的指针来进行碰撞检测。但此刻我尝试#包括在玩家一个敌对阶级,我得到敌人一个“玩家未定义”错误....我认为它与头部包裹做...
#pragma once
#include <string>
#include <vector>
#include "mathlib.h"
#include "md2model.h"
#include "Object3DS.h"
const float PLAYER_FORWARD_SPEED = 60.0f;
const float PLAYER_HEADING_SPEED = 60.0f;
class Player : public GameObject
{
public:
Player(float r);
~Player();
void loadModel(const char *filename);
void drawModel();
void drawBoundingWireframe();
void passVisibleObjects(vector<Object3DS*> &vo);
private:
Entity3D entity;
MD2Model* player;
float modelRot;
float modelPitch;
Vector3 scale;
Vector3 pos;
Vector3 rot;
float forwardSpeed;
float heading;
float radius;
vector<Object3DS*> visibleObjects;
};
这是敌对阶级
#pragma once
#include <string>
#include <vector>
#include "Player.h"
#include "mathlib.h"
#include "md2model.h"
const float ENEMY_FORWARD_SPEED = 60.0f;
const float ENEMY_HEADING_SPEED = 60.0f;
class Enemy : public GameObject
{
public:
Enemy(Player* p, float r);
~Enemy();
void loadModel(const char *filename);
void drawModel();
void drawBoundingWireframe();
bool checkCollision();
void setPosition(Vector3 pos);
void setRotation(Vector3 r);
void setScale(Vector3 r);
void setSpeed(float s);
void setHeading(float h);
float getForwardSpeed();
float getHeading();
void rotateModel(float dx, float dy);
void resetRotation();
void setAnimation(char *filename);
Vector3 getPosition();
void moveEnemy(float elapsedTimeSec);
Entity3D entity;
void passVisibleObjects(vector<Object3DS*> &vo);
private:
MD2Model* enemy;
Player* player;
float modelRot;
float modelPitch;
Vector3 scale;
Vector3 pos;
Vector3 rot;
float forwardSpeed;
float heading;
float radius;
vector<Object3DS*> visibleObjects;
};
在源文件包括我的一些碰撞功能此静态类:
#pragma once
#include <vector>
#include "mathlib.h"
#include "Object3DS.h"
#include "Enemy.h"
class CollisionMgr{
public:
static vector<Object3DS*> findVisibleObjects(BoundingBox &viewingVolume, vector<Object3DS> &gameObjects, vector<Object3DS*> &visibleObjects);
static vector<Enemy*> findVisibleEnemies(BoundingBox &viewingVolume, vector<Enemy> &enemies, vector<Enemy*> &visibleEnemies);
static bool checkCollision(const Vector3 pos, const Vector3 forward, float radius, const vector<Object3DS*> &vo);
static double intersectRaySphere(Vector3 rO, Vector3 rV, Vector3 sO, double sR);
};
所有这些编译好的这样,但现在我尝试添加#包括“敌人“在播放器中我得到错误C2061:语法错误:标识符'玩家'在敌人类....或如果我包括成功敌人,然后尝试包括CollisionMgr ....他们之间存在某种冲突和定义的球员,但我无法理解如何解决它....
我使用VS2010作为我的编译器..
任何帮助,将不胜感激!
我试着重新安排包含声明,但我真的不明白是什么原因造成的?
答
这是一个循环依赖的情况。您需要正确转发声明Player
和Enemy
,并且您将无法在相反的头文件中使用它们的定义。你可以在实现文件中使用它们。这里有一个例子:
Player.h
class Player
{
// needs to know about Enemy
void f(const Enemy& b);
};
Enemy.h
class Enemy
{
// needs to know about Player
void f(const Player& a);
};
包括在这两个位置的头文件会导致错误(如你所看到的):
Player.h
// This isn't going to work...
#include "Enemy.h"
class Player
{
// needs to know about Enemy
void f(const Enemy& b);
};
Enemy.h
// This isn't going to work...
#include "Player.h"
class Enemy
{
// needs to know about Player
void f(const Player& a);
};
这里需要的是一个 “向前声明” 为Player
和Enemy
在适当情况下,像这样:
Player.h
// forward declaration:
class Enemy;
class Player
{
// needs to know about Enemy
void f(const Enemy& b);
};
Enemy.h
然后在执行文件中你可以#include
适当的头文件,以实际获得编译单元中对象的定义。
这确实解决了这个问题。非常感谢你 – Alex