这个问题与我的计划有关。我之前使用指针手动管理,现在我试图转向智能指针(出于所有原因)。
在普通指针中,使用 new 关键字很容易调用类的构造函数。就像下面的程序一样:
Button * startButton;
startButton = new Button(int buttonID, std::string buttonName);
使用智能指针时,调用类的构造函数的替代方法是什么。我在下面所做的就是错误:
std::unique_ptr<Button> startButton;
startButton = std::unique_ptr<Button>(1, "StartButton"); // Error
我得到的错误如下:
Error 2 error C2661: 'std::unique_ptr<Button,std::default_delete<_Ty>>::unique_ptr' : no overloaded function takes 2 arguments
答案 0 :(得分:4)
std::unique_ptr
是指针的包装器,因此要创建std::unique_ptr
的正确对象,您应该将指针传递给它的构造函数:
startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));
从C ++ 14开始,还有一个辅助函数make_unique
,它可以为你做这个分配:
startButton = std::make_unique<Button>(1, "StartButton");
如果可用,请使用std::make_unique
,因为它更容易阅读,在某些情况下使用它比直接使用new
更安全。
答案 1 :(得分:1)
如果您的编译器支持C ++ 14,则可以使用:
startButton = std::make_unique<Button>(1, "StartButton");
如果您只能使用C ++ 11,则需要使用:
startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));