重新启动游戏并重新实例化全局对象

时间:2014-01-31 10:46:38

标签: c++ class object instance reset

这是一个与我已经看过的问题非常类似的问题,在这里回答 - Restarting a game and reinstantiate objects

我想要完全相同的东西,除了我的问题略有不同,我希望重新实现的对象是'全局',并且只在程序第一次运行时才创建。

目前我在#includes之后和我的函数原型之前创建了新的'Player'......

#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'传递给其他所有函数,如果有办法避免这样做,我只是在徘徊?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

您真的不需要动态分配。您可以像这样声明一个自动变量:

Player player;

然后当你想重置它时,你可以使用:

player = Player();

永远记住,动态分配很昂贵。


我可能会做的是创建一个“工厂”功能:

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

这样你就可以摆脱那个全局对象。不要担心返回时复制对象的性能:通过众所周知的优化(返回值优化 - RVO)来删除副本。