3
#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;
}

我想摆脱原始指针,这样我就不用担心异常和清理。是否有一个简单的解决方案(我是一个非常愚蠢的青少年)还是不值得?谢谢!

4

1 回答 1

7

只需将您的向量更改为:

std::vector<std::unique_ptr<GameState>> game_states_container;

并摆脱delete你的析构函数中的任何东西。事实上,你可以完全摆脱析构函数,除非它有其他工作要做。

unique_ptr不可复制但它是可移动的,因此值得对 C++11 移动语义有所了解。当您想将 a 添加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应该有一个 virtual destructor无关。

Live demo

于 2015-02-01T12:49:13.340 回答