Перезапустите игру и восстановите глобальный объект

78
10

Это очень схожая проблема с вопросом, на который я уже посмотрел, ответил здесь - Перезапуск игры и восстановление объектов.

Я хочу точно такую же вещь, кроме того, что моя проблема несколько отличается тем, что объект, который я хочу восстановить, является "глобальным" и создается только когда программа запускается.

В настоящее время я создаю новый "Player" после моих #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" для каждой другой функции, я просто блуждал, если бы был способ избежать этого?

спросил(а) 2021-01-19T17:05:26+03:00 6 месяцев, 1 неделя назад
1
Решение
64

Вам не требуется динамическое распределение. Вы можете просто объявить автоматическую переменную следующим образом:

Player player;

а затем, когда вы хотите сбросить его, вы можете использовать:

player = Player();

Всегда помните, что динамическое распределение дорого.


Вместо этого я бы сделал, чтобы создать "фабричную" функцию:

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

Чтобы вы могли избавиться от этого глобального объекта. Не беспокойтесь о производительности копирования объекта при возврате: копии удаляются с помощью известной оптимизации (оптимизация возвращаемого значения - RVO).

ответил(а) 2021-01-19T17:05:26+03:00 6 месяцев, 1 неделя назад
64

Вы можете создать нового игрока в 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();
}

ответил(а) 2021-01-19T17:05:26+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема