【问题标题】:C++ - how to push objects to std::stack of std::shared_ptr?C++ - 如何将对象推送到 std::shared_ptr 的 std::stack?
【发布时间】:2016-07-15 03:55:22
【问题描述】:

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

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::shared_ptrs 的 std::stack 上的正确方法是什么? 我想使用它们,因为它提供了我需要的“垃圾收集器”,因为如果我在对象是类 C 指针时从堆栈中弹出元素,它不会调用析构函数。

【问题讨论】:

  • statesManager.pushState(std::shared_ptr&lt;GameState&gt;(new StateSplash(this)));
  • @IgorTandetnik 您应该发布答案并解释为什么明确ly ;),而不是发表评论。

标签: c++ stack shared-ptr


【解决方案1】:

假设StateSplashGameState 的孩子。

您的方法接受std::shared_ptr,并且您正尝试将普通指针传递给它。你的编译器不知道如何从StateSplash *std::shared_ptr&lt;GameStage&gt;

您必须通过任一方式构造std::shared_ptr

statesManager.pushState(std::make_shared&lt;GameState&gt;(this));

statesManager.pushState(std::shared_ptr&lt;GameState&gt;(new StateSplash(this)));

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 2017-03-22
    • 2014-01-11
    • 2011-05-19
    • 1970-01-01
    • 2011-05-04
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多