2014-01-31 58 views
0

這是一個非常類似的問題,我已經看過一個問題,在這裏回答 - Restarting a game and reinstantiate objects重新啓動遊戲並重新創建一個全局對象

我想完全一樣的東西,除了我的問題略有不同,因爲我希望重新實例的對象是'全局',並且只有在程序第一次運行時纔會創建。

目前我創建新的「球員」之後我的#includes之前我的函數原型...

#include "Player.h" 
#include "Monster.h" 

using namespace std; 

string MonsterTypes[3] = {"Orc","Goblin","Dark Rider"}; 
//create a stack of 'monsters' 
stack<Monster>MonsterList; 

Player* NewPlayer = new Player(); 

int NewGame(); 
void SetupPlayer(); 
void SetupMonsters(); 
void MainGame(); 
void Combat(); 
int GetMonstersLeft(); 

我是否需要只是創建一個完整的工廠類創建一個單一的播放器?顯然,當我調用函數'setupPlayer'時,我可以在那裏創建播放器對象,但是如果有辦法避免這樣做,我是不是必須將'NewPlayer'傳遞給其他所有函數?

+1

「重新啓動」任何程序的一種方法是簡單地創建一個運行自己的新進程,同時退出原始進程。它看起來像程序從一開始就完全開始。 –

+0

只需調用'delete NewPlayer; NewPlayer = new Player();' – manuell

回答

1

您可以在SetupPlayer中創建新玩家,並將其分配給NewPlayer

由於全局NewPlayer是一個指向Player對象,你可以簡單地創建在其設立一個新的Player每次調用SetupPlayer()時間,如下所示:

Player* NewPlayer = NULL; // Initialized when calling SetupPlayer() 

void SetupPlayer() { 
    delete NewPlayer; // Delete the previous player (if any) 
    NewPlayer = new Player(); 
} 
+0

請注意,用上面的代碼輸入*未定義行爲*的危險和魔法世界。小心怪物。 – Shoe

+0

@Jefffrey這是怎麼回事? – WaelJ

+0

因爲'刪除'NULL'指針是*未定義的行爲*? – Shoe

1

你並不真的需要動態分配。你可以只聲明自動變量是這樣的:

Player player; 

,然後當你想要重置它,你可以使用:

player = Player(); 

永遠記住,動態分配是昂貴的。


我可能會做,相反,是創建一個「工廠」功能:

Player make_player() { 
    Player ret; 
    // setup ret 
    return ret; 
} 

這樣就可以擺脫全球的對象。不要擔心在返回時複製對象的性能:通過衆所周知的優化(返回值優化 - RVO)消除副本。