使共享指针指向新实例

时间:2014-08-02 23:15:13

标签: c++ sfml smart-pointers

所以我有一个抽象基类BaseScreen和一个子类MainMenu(和其他几个)。 然后我创建一个智能指针std::shared_ptr<BaseScreen> CurrentScreen。但是,当我尝试做这样的事情时:

CurrentScreen = std::make_shared<rpg::MainMenu>(new rpg::MainMenu());

我收到错误C2664。我仍然是相当新的智能指针,我试图研究为什么我收到此错误,但我找不到任何与此错误和智能指针相关的内容。 (虽然我对错误本身发生的原因有一个大概的了解。)

以下是需要的代码:

class BaseScreen : public sf::Drawable
{  
public:
    virtual void HandleEvents(sf::RenderWindow& screen, sf::Event events) = 0;

    BaseScreen(){}
    virtual ~BaseScreen(){}

};

...

class MainMenu : public BaseScreen
{
private:
    ButtonComponent myStartButton;

public:

    virtual void HandleEvents(sf::RenderWindow& screen, sf::Event events){}

    MainMenu(){}
    ~MainMenu(){}

private:
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        /* ... */
    }
};

...

class Screens : public sf::Drawable
{
private:
    std::shared_ptr<BaseScreen> myScreen;

public:
    Screens() 
    {
        //error C2664
        myScreen = std::make_shared<rpg::MainMenu>(new rpg::MainMenu());
    }
    ~Screens(){}

private:
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        /* ... */
    }
};

1 个答案:

答案 0 :(得分:2)

std::make_shared构造对象本身。您应传递给它的参数是您要传递给对象构造函数的参数。如果您希望对象是默认构造的,那么:

CurrentScreen = std::make_shared<rpg::MainMenu>();

如果您将new rpg::MainMenu()传递给std::make_shared,那么它会尝试将rpg::MainMenu*类型的指针传递给rpg::MainMenu的构造函数,真的很有道理。