【问题标题】:Smart pointers when dealing with constructors处理构造函数时的智能指针
【发布时间】:2015-06-05 13:48:10
【问题描述】:

这个问题是关于我的程序的。我之前使用指针使用手动管理,现在我正试图转向智能指针(出于所有充分的理由)。

在普通指针中,使用 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

【问题讨论】:

标签: c++ constructor smart-pointers


【解决方案1】:

std::unique_ptr 是指针的包装器,因此要创建正确的 std::unique_ptr 对象,您应该将指针传递给其构造函数:

startButton = std::unique_ptr&lt;Button&gt;(new Button(1, "StartButton"));

从 C++14 开始,还有一个辅助函数 make_unique 会在后台为您执行此分配:

startButton = std::make_unique<Button>(1, "StartButton");

如果std::make_unique 可用,最好使用它,因为它更易于阅读,并且在某些情况下使用它比直接使用new 更安全。

【讨论】:

  • C++11 中 make_unique 的缺失是委员会的一个简单疏忽,但您可以简单地在 C++11 中构建自己的 make_unique 实现,正如 @ 中所指出的那样987654321@答案。
【解决方案2】:

如果你有一个支持 C++14 的编译器,你可以使用:

startButton = std::make_unique<Button>(1, "StartButton");

如果你被限制使用C++11,你需要使用:

startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2017-07-04
    • 1970-01-01
    • 2012-02-10
    • 2012-04-17
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多