C ++ - 如何将对象推送到std :: shared的std :: shared_ptr?

时间:2016-03-27 21:44:34

标签: c++ stack shared-ptr

我遇到了堆栈共享指针的问题。

GameState.hpp:

class GameState : std::enable_shared_from_this<GameState>
{
public:
    virtual void update(float delta) = 0;
    virtual void render() = 0;
    virtual void handleInput() = 0;
protected:
    Game* mGame;

StatesManager.hpp:

class StatesManager
{
public:
    StatesManager();
    ~StatesManager();

    void pushState(std::shared_ptr<GameState> state);
    void changeState(std::shared_ptr<GameState> state);
    void popState();
    std::shared_ptr<GameState> peekState();
private:
    std::stack<std::shared_ptr<GameState> > mStates;
};

以下是我试图推动的方式:

statesManager.pushState(new StateSplash(this));

但是这给了我这个错误:

no suitable constructor exists to convert from "StateSplash *" to "std::shared_ptr<GameState>"

将对象推送到std :: stack of std :: shared_ptrs的正确方法是什么? 我想使用它们,因为它提供了我需要的&#34;垃圾收集器&#34;,因为如果我在堆栈中弹出元素,当对象是类C指针时,它不会调用析构函数。

1 个答案:

答案 0 :(得分:3)

假设StateSplashGameState的孩子。

您的方法接受std::shared_ptr并尝试将正常指针传递给它。您的编译器不知道如何从StateSplash *std::shared_ptr<GameStage>

您必须通过

构建std::shared_ptr

statesManager.pushState(std::make_shared<GameState>(this));

statesManager.pushState(std::shared_ptr<GameState>(new StateSplash(this)));