【问题标题】:Restart a game and reinstantiate a global object [duplicate]重新启动游戏并重新实例化全局对象[重复]
【发布时间】:2014-02-24 00:47:10
【问题描述】:

这是一个与我已经看过的问题非常相似的问题,在这里回答 - 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”传递给其他所有函数,如果有办法避免这样做,我只是在徘徊?

【问题讨论】:

  • “重新启动”任何程序的一种方法是简单地创建一个运行自身的新进程,同时退出原始进程。看起来程序从头开始完全重新开始。
  • 拨打delete NewPlayer; NewPlayer = new Player();

标签: c++ class object instance reset


【解决方案1】:

您实际上并不需要动态分配。你可以像这样声明一个自动变量:

Player player;

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

player = Player();

永远记住动态分配是昂贵的。


相反,我可能会做的是创建一个“工厂”函数:

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

这样你就可以摆脱那个全局对象了。不必担心返回时将对象复制回来的性能:副本会被众所周知的优化(返回值优化 - RVO)省略。

【讨论】:

    【解决方案2】:

    您可以在SetupPlayer中创建一个新播放器,并将其分配给NewPlayer

    由于您的全局NewPlayer 是一个指向Player 对象的指针,您只需在每次调用SetupPlayer() 时在其位置创建一个新的Player,如下所示:

    Player* NewPlayer = NULL;  // Initialized when calling SetupPlayer()
    
    void SetupPlayer() {
        delete NewPlayer;  // Delete the previous player (if any)
        NewPlayer = new Player();
    }
    

    【讨论】:

    • 请注意,使用上面的代码进入未定义行为的危险而神奇的世界。当心怪物。
    • 因为deleteNULL 指针是未定义的行为
    • 不是这样的,它被定义为无操作by the standard
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多