Это очень схожая проблема с вопросом, на который я уже посмотрел, ответил здесь - Перезапуск игры и восстановление объектов.
Я хочу точно такую же вещь, кроме того, что моя проблема несколько отличается тем, что объект, который я хочу восстановить, является "глобальным" и создается только когда программа запускается.
В настоящее время я создаю новый "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" для каждой другой функции, я просто блуждал, если бы был способ избежать этого?
Вы можете создать нового игрока в 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();
}
Вам не требуется динамическое распределение. Вы можете просто объявить автоматическую переменную следующим образом:
Player player;
а затем, когда вы хотите сбросить его, вы можете использовать:
player = Player();
Всегда помните, что динамическое распределение дорого.
Вместо этого я бы сделал, чтобы создать "фабричную" функцию:
Player make_player() {
Player ret;
// setup ret
return ret;
}
Чтобы вы могли избавиться от этого глобального объекта. Не беспокойтесь о производительности копирования объекта при возврате: копии удаляются с помощью известной оптимизации (оптимизация возвращаемого значения - RVO).
delete NewPlayer; NewPlayer = new Player();