2012-09-26 111 views
2

我目前正在開發一個使用C++的RPG遊戲,並且我已經到了在地圖上包括事件的地步。訪問同一父母的其他孩子的元素的孩子

我想讓地圖上的事件能夠治癒玩家。我認爲最簡單的方法是使用'this'關鍵字將指針傳遞給遊戲中的事件對象。當我這樣做時,出現了一大堆編譯器錯誤,這些錯誤似乎是由於試圖包含一個當前試圖包含其他類的類而導致的。 (無盡循環,我猜?)

例如。我有我的'遊戲'類,它有一個屬於'mapManager'類的公共成員。 'mapManager'對象將'event'對象作爲成員。 '遊戲'對象在其成員中也有'玩家'對象。我需要讓「事件」對象更改「玩家」所具有的變量。每當我需要它時,我都可以誠實地拋出指針,但這可能會很麻煩。

我想問的是,如果有一個簡單的方法讓父母的孩子訪問該父母的另一個孩子,或者如果它更容易拋出指向所有需要他們指向的孩子類的指針給其他孩子。

哇...這沒什麼意義,但希望有人能夠理解,給我一個很好的答案。這裏有一些代碼,以防它有幫助。

:game.h

include "player.h" include "event.h"

class game { public: player Player; event Event; };

:player.h

class player { public: game* Game;

};

:event.h

class event { public: game* Game; };

剛剛這將導致「遊戲沒有指定類型」,所以我想包括event.h和player.h遊戲,並得到了同樣的錯誤。我想要做的就是能夠從內部事件中訪問玩家的變量HP。

+1

您聽起來需要觀察者設計模式。您需要顯示代碼和錯誤以獲得有關您的特定問題的真正幫助。 – andre

+0

我不想發佈我的整個代碼,因爲老實說它太麻煩和複雜了。我做了一些示例代碼,並得到相同的錯誤。我將編輯問題以包含代碼。 – Kethaias

回答

3

如果可能,最好避免循環引用;然而如果你真的想要做到這一點,那麼解決方案是在頭文件的頂部向前聲明你的類Game,它將使用引用/指針。例如

#ifndef EVENTH 
#define EVENTH 

class Game; 

class Event 
{ 
    Game* game; 
}; 

#endif 

和..

#ifndef PLAYERH 
#define PLAYERH 

class Game; 

class Player 
{ 
    Game* game; 
}; 

#endif 

對於那些不需要執行knowlege /的sizeof的Game類,一個簡單的前瞻性聲明是足以讓編譯器的頭文件知道,與一類名稱存在。

在你.cpp源文件(其中Game實現是真正重要的,並通過播放器/事件實現中使用),你仍然需要#include包含您的遊戲類定義的頭。

2
//game.h 
class event; 
class game { 
    event _e; 
private: 
    game(){} 
    //game& operator=(game& other) {} 
    ~game(){} 
public: 
    static game & getInstance() { 
     static game instance; 
     return instance; 
    } 
    event& getEvent() {return _e;} 
}; 


//HealEventObserver.h 
class HealEventObserver { 
public: 
    virtual void heal() = 0; 
    virtual ~HealEventObserver(){} 
}; 

//player.h include game.h and HealEventObserver.h event.h 
class Player : public HealEventObserver 
{ 
public: 
    virtual void heal() {/*heal the player*/} 
    Player() { 
     game& instance = game::getInstance(); 
     event& e = instance.getEvent(); 
     e.registerObserver(this); 
    } 
}; 

//event.h include HealEventObserver.h 
class event { 
    std::set<HealEventObserver*> _observers; 
    void notify() { 
     std::set<HealEventObserver*>::iterator it = _observers.begin(); 
     std::set<HealEventObserver*>::iterator end = _observers.end(); 
     for(;it!=end; ++it) { 
      it->heal(); 
     } 
    } 
public: 
    void registerObserver(HealEventObserver* observer) {_observers.insert(observer);} 
}; 

不要讓你的事件對象改變玩家只是讓事件告訴玩家自己治療。此外,如果遊戲是假設代表一切,那麼使其成爲全球。


要回答評論:(這只是我的看法,並沒有別的)

經過一些研究,我發現這個鏈接,提供了很大的引用的名稱。

The Definitive C++ Book Guide and List

+0

雖然這對我來說很有意義,但我現在意識到我對語言本身知之甚少。它可能會問很多,但有什麼方法可以讓我指向一本涵蓋更高級主題的好書。我收藏了幾本書,但大多數都沒有詳細介紹更先進的東西,只是提到它們存在。不必是書籍,但這是我的偏好。我很感謝在這個問題上的任何幫助,但你已經做了很多,我明白你是否不願意。感謝您迄今爲止所做的一切幫助我。 – Kethaias

+0

@Kethaias:我回答了你上面的評論。 – andre

+1

請勿使用cplusplus.com。該網站包含很多錯誤,並促成糟糕的編程習慣。 – 2012-09-28 09:28:12

相關問題