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

0

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

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

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

  • 1
    Один из способов «перезапустить» любую программу - это просто создать новый процесс, который запускается сам при выходе из исходного процесса. Казалось бы, программа начинается заново с самого начала.
  • 0
    Просто позвоните delete NewPlayer; NewPlayer = new Player();
Теги:
class
object
reset
instance

2 ответа

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
    Обратите внимание, что с помощью кода выше вы попадаете в опасный и волшебный мир неопределенного поведения . Остерегайтесь монстров.
  • 0
    @ Джефффри Как так?
Показать ещё 2 комментария
1

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

Player player;

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

player = Player();

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


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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню