通过构造函数初始化unique_ptr

时间:2013-05-10 23:09:05

标签: c++ c++11

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?

2 个答案:

答案 0 :(得分:11)

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

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

其次,当您需要std::make_shared时,shared_ptr会为您提供unique_ptr。不幸的是,没有std::make_uniqueyet),所以你必须这样做:

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

仅当BaseHandle来自HandleInterface时才会有效。

答案 1 :(得分:0)

更新现代C ++

回应约瑟夫的精彩回答,这是他第二点的最新消息:

  

其次,当您需要 javax.faces.FacesException: Error Instantiating: com.sun.faces.facelets.tag.composite.ImplementationHandler时,std::make_shared会为您提供shared_ptr。不幸的是,没有unique_ptryet),所以你必须这样做......

请注意,现在有std::make_unique方法:

  

<强>的std :: make_unique

     

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

中      

1)构造一个非数组类型T.参数args传递给T的构造函数。如果T不是数组类型,则此重载仅参与重载解析。该功能相当于:

     

std::make_unique

     

2)构造一个未知边界T的数组。如果T是未知边界的数组,则此重载仅参与重载解析。该功能相当于:

     

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

     

3)不允许构建已知界限的阵列。

Reference