2016-03-27 3 views
2

У меня проблема со стекю общих указателей.C++ - как нажимать объекты на std :: stack из std :: 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 из std :: shared_ptrs? Я хочу использовать их, потому что он предоставляет «сборщик мусора», который мне нужен, потому что, если я поплю элемент из стека, когда объект является C-подобным указателем, он не вызывает деструктор.

+0

'statesManager.pushState (станд :: shared_ptr (новый StateSplash (это)));' –

+0

@IgorTandetnik Вы должны отправить ответ и объяснить, почему * explicit * ly;), а не комментарий. – vsoftco

ответ

3

Предполагая, что StateSplash является ребенком GameState.

Ваш метод принимает 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)));

Смежные вопросы