处理构造函数时的智能指针

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 更安全。