处理构造函数时的智能指针
Smart pointers when dealing with constructors
这个问题是关于我的程序的。我之前使用指针进行手动管理,现在我正尝试转向智能指针(出于所有充分的理由)。
在普通指针中,很容易通过使用 new 关键字调用 class 的构造函数。就像下面的程序:
Button * startButton;
startButton = new Button(int buttonID, std::string buttonName);
使用智能指针时,为 class 调用构造函数的替代方法是什么?我在下面所做的给出了一个错误:
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
如果你有支持C++14的编译器,你可以使用:
startButton = std::make_unique<Button>(1, "StartButton");
如果你被限制使用C++11,你需要使用:
startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));
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
更安全。
这个问题是关于我的程序的。我之前使用指针进行手动管理,现在我正尝试转向智能指针(出于所有充分的理由)。
在普通指针中,很容易通过使用 new 关键字调用 class 的构造函数。就像下面的程序:
Button * startButton;
startButton = new Button(int buttonID, std::string buttonName);
使用智能指针时,为 class 调用构造函数的替代方法是什么?我在下面所做的给出了一个错误:
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
如果你有支持C++14的编译器,你可以使用:
startButton = std::make_unique<Button>(1, "StartButton");
如果你被限制使用C++11,你需要使用:
startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));
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
更安全。