使共享指针指向新实例

Making shared pointer point to new instance

本文关键字:实例 新实例 共享 指针      更新时间:2023-10-16

所以我有一个抽象基类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
    {
        /* ... */
    }
};

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

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

如果您将new rpg::MainMenu()传递给std::make_shared,那么它将尝试将这个类型为rpg::MainMenu*的指针传递给rpg::MainMenu的构造函数,这实际上没有意义。