通过构造函数初始化 unique_ptr

2024-04-04

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_ptrhandle_正确吗?

我想像这样使用它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的正确方法?


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

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

Second, std::make_shared会给你一个shared_ptr,当你想要一个unique_ptr。不幸的是,这儿没有std::make_unique (yet http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3656.htm),所以你必须这样做:

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

这只有在以下情况下才有效BaseHandle源自HandleInterface.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过构造函数初始化 unique_ptr 的相关文章