#include <vector>
enum ListOfGameStates
{
// List of game states
};
class GameState()
{
public:
GameStates(); // Initializes protected (global) variables
virtual ListOfGameStates run() = 0;
protected:
// Heavyweigh resource managers containing all resources and other global vars
}
class GameStateManager()
{
public:
GameStateManager(); // Creates all game states
~GameStateManager(); // Deletes all game states
void run(); // Switches from one state to another state
private:
// A vector of raw pointers to game states. GameState is a base class.
std::vector<GameState*> game_states_container;
}
Я хочу избавиться от необработанных указателей, чтобы не беспокоиться об исключениях и очистке. Есть простое простое решение (Я действительно тупой подросток) или оно того не стоит? Спасибо!
Просто измените свой вектор на:
std::vector<std::unique_ptr<GameState>> game_states_container;
И избавиться от любого delete
в вашем деструкторе. На самом деле вы, вероятно, можете полностью избавиться от деструктора, если у него нет других дел.
unique_ptr
не копируемый, но подвижный, поэтому стоит иметь представление о семантике перемещения C ++ 11. Когда вы хотите добавить unique_ptr
к вашему контейнеру вы можете использовать push_back
если вы передаете временное значение, например, возвращаемое значение функции:
game_states_container.push_back(createGameState());
game_states_container.push_back(std::make_unique<GameStateA>()); // C++14
Или если у вас есть местный unique_ptr
переменная, которую вы можете использовать std::move
чтобы переместить его в вектор:
std::unique_ptr<GameState> game_state = std::make_unique<GameStateA>(); // C++14
// auto game_state = std::unique_ptr<GameState>(new GameStateA); // C++11
...
game_states_container.push_back(std::move(game_state));
Хорошей практикой является размещение сырых указателей в unique_ptr
как только ты new
их (или желательно использовать std::make_unique
). В противном случае, если между распределением и переносом возникает исключение unique_ptr
у вас утечка памяти
Это не связано с unique_ptr
но твой GameState
учебный класс должен иметь виртуальный деструктор.