因此,我有一个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/