2016-03-27 18 views
2

Ich habe ein Problem mit dem Stapel geteilten Zeigern.C++ - wie man Objekte zu std :: std 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; 
}; 

Hier ist, wie ich zu schieben bin versucht:

statesManager.pushState(new StateSplash(this)); 

Aber das ist, gibt mir diese Fehlermeldung:

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

Was ist die richtige Methode, um ein Objekt auf std :: std :: shared_ptrs zu schieben? Ich möchte sie verwenden, weil es "Garbage Collector" zur Verfügung stellt, die ich brauche, denn wenn ich Element vom Stapel knalle, wenn Objekt C-like Zeiger ist, ruft es Destruktor nicht auf.

+0

'statesManager.pushState (std :: shared_ptr (neu StateSplash (this))) zu konstruieren;' –

+0

@IgorTandetnik Sie sollten eine Antwort posten und erklären, warum * explizit * ly;), anstatt einen Kommentar. – vsoftco

Antwort

3

Angenommen, StateSplash ist ein Kind von GameState.

Ihre Methode akzeptiert eine std::shared_ptr und Sie versuchen, einen normalen Zeiger in es zu übergeben. Ihr Compiler weiß nicht, wie Sie von StateSplash * zu std::shared_ptr<GameStage> gelangen.

Sie haben eine std::shared_ptr entweder durch

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

oder

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

Verwandte Themen