因此,我有一个Abstract基类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的构造函数,这实际上没有意义。

关于c++ - 使共享指针指向新实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25100214/

10-09 13:36