通过构造函数初始化一个unique_ptr

Initializing an unique_ptr though a constructor

本文关键字:一个 unique ptr 构造函数 初始化      更新时间:2023-10-16
class BaseShader {
        std::unique_ptr<HandleInterface> handle_;
    public:
        BaseShader();
        BaseShader(std::unique_ptr<HandleInterface> handle_ptr);

. cpp

BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr) {
    handle_.reset(handle_ptr.get());
}
//BaseHandle implements HandleInterface
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
}

如何正确初始化我的unique_ptr handle_ ?

我想这样使用它BaseShader s(std::make_shared<BaseHandle>());

Clang告诉我

error: no matching constructor for initialization of 'BaseShader'
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
                         ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我可能搞砸了。

1)。构造函数参数正确吗?BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)

2)。如果1.)为真,handle_.reset(handle_ptr.get());是初始化我的handle_ unique_ptr的正确方法吗?

首先,您应该简单地将构造函数的参数std::move改为成员初始化列表中的handle_:

BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)
  : handle_(std::move(handle_ptr))
{ }

第二,当你想要一个unique_ptr时,std::make_shared会给你一个shared_ptr。不幸的是,还没有std::make_unique,所以你必须这样做:

BaseShader::BaseShader()
  : BaseShader(std::unique_ptr<BaseHandle>(new BaseHandle()))
{ }

如果BaseHandle是从HandleInterface派生出来的

更新为现代c++

作为对约瑟夫精彩回答的回应,下面是他第二点的更新:

第二,当你想要一个unique_ptr时,std::make_shared会给你一个shared_ptr。不幸的是,没有std::make_unique(尚未),所以您必须这样做…

注意现在有一个std::make_unique方法:

std:: make_unique

构造一个T类型的对象,并将其包装在std::unique_ptr中。

1)构造一个非数组类型T。参数args传递给T的构造函数。只有当T不是数组类型时,重载才参与重载解析。该函数相当于:

unique_ptr<T>(new T(std::forward<Args>(args)...))

2)构造一个未知界T的数组,此重载仅在T是未知界数组时参与重载解析。该函数相当于:

unique_ptr<T>(new typename std::remove_extent<T>::type[size]())

3)不允许构造已知边界的数组。

参考