2013-07-17 63 views
0

當編譯我的C++程序中,我收到任何錯誤,但是內unordered_map哈希函數失敗,試圖通過0爲什麼必須將我的全局變量聲明爲指針?

(STL的hashtable_policy.h的345線)國防部我已經找到了解決,但不要」不知道爲什麼我一開始就遇到問題。 我的結構是這樣的,(很抱歉的特定代碼。)

struct Player { 
private: 
    Entity& entity = entityManager->create(); 
public: 
    Player() { 
     entity.addComponent(new PositionComponent(0, 0)); // Add component uses the unordered map. 
    } 
}; 
Player playerOne; // Error perpetuates through constructor. 

但是,如果我宣佈playerOne爲指針,像這樣:

Player* playerOne; 

,然後調用:

playerOne = new Player(); 

我沒有任何問題。

我一直在尋找 - 沒有成功。我可能做錯了什麼?

+0

'entityManager-> create()'是否返回臨時值。如果是這樣,你最終會得到一個懸而未決的參考。 –

回答

7

當你使用Player作爲全局函數時,你不知道entityManager(大概是另一個全局函數)是否已經初始化 - 全局初始化的順序沒有定義。

當你使用指針並用new(在main()中,我假設)初始化它時,所有的全局變量都被創建了,所以代碼工作。

這突出顯示了全局變量是一個壞主意的原因之一。

+0

你是對的,entityManager是一個全球性的。你能否提出另一種方法來完成同樣的事情,而不需要我用新的初始化? –

+2

向玩家添加構造函數參數以獲取實體。在main()中,創建Entity對象,然後創建Player對象,傳入剛剛創建的實體。真正的問題是使用全局變量 - 而不是訪問全局播放器的所有其他代碼,將創建的Player實例傳遞給它們。 – SteveLove

相關問題