2011-11-04 81 views
0

這非常奇怪,我無法理解它是什麼導致它發生的......因此,我有兩個類: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作爲我的編譯器..

任何幫助,將不勝感激!

我試着重新安排包含聲明,但我真的不明白是什麼原因造成的?

回答

4

這是一個循環依賴的情況。您需要正確轉發聲明PlayerEnemy,並且您將無法在相反的頭文件中使用它們的定義。你可以在實現文件中使用它們。這裏有一個例子:

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); 
}; 

這裏需要的是一個 「向前聲明」 爲PlayerEnemy在適當情況下,像這樣:

Player.h

// forward declaration: 
class Enemy; 

class Player 
{ 
    // needs to know about Enemy 
    void f(const Enemy& b); 
}; 

Enemy.h

然後在執行文件中你可以#include適當的頭文件,以實際獲得編譯單元中對象的定義。

+0

這確實解決了這個問題。非常感謝你 – Alex

相關問題