3
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>());

叮当告诉我

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 的正确方法吗?

4

2 回答 2

11

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

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

其次,std::make_sharedshared_ptr在你想要的时候给你一个unique_ptr。不幸的是,没有std::make_unique),所以你必须这样做:

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

这只有在BaseHandle派生自时才有效HandleInterface

于 2013-05-10T23:12:38.427 回答
2

现代 C++ 的更新

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

其次,std::make_sharedshared_ptr在你想要的时候给你一个unique_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) 不允许构造已知界限的数组。

参考

于 2018-02-02T16:31:26.767 回答