通过构造函数初始化unique_ptr [英] Initializing an unique_ptr though a constructor
问题描述
class BaseShader {
std :: unique_ptr< HandleInterface>处理_;
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 _
? $ b
$ b 我想像这样使用 BaseShader s(std :: make_shared< BaseHandle>());
Clang告诉我
错误:没有匹配的构造函数用于初始化'BaseShader'
BaseShader :: BaseShader():BaseShader(std :: make_shared< BaseHandle>()){
^ ~~~~~~~~~~~~~~~~~~~~ ~~~~~
我可能搞错了。
1。)我的构造函数参数是否正确? BaseShader :: BaseShader(std :: unique_ptr< HandleInterface> handle_ptr)
2)如果1.) true handle_.reset(handle_ptr.get());
正确的方式初始化我的handle_ unique_ptr?
解决方案首先,你应该从构造函数的参数 std :: move
code>在成员初始化列表中:
BaseShader :: BaseShader(std :: unique_ptr< HandleInterface> handle_ptr)
:handle_(std :: move(handle_ptr))
{}
,当你需要一个 unique_ptr 时, std :: make_shared
会给你一个 shared_ptr
code>。不幸的是,没有 std :: make_unique
(还有),所以你必须这样做:
BaseShader :: BaseShader()
:BaseShader(std :: unique_ptr< BaseHandle>(new BaseHandle()))
{}
这只有在 BaseHandle
派生自 HandleInterface
p>
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>()) {
}
How would I initialize my unique_ptr handle_
correctly?
I want to use it like this BaseShader s(std::make_shared<BaseHandle>());
Clang tells me
error: no matching constructor for initialization of 'BaseShader'
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I probably messed it up.
1.) Is my constructor argument correct? BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)
2.) If 1.) is true is handle_.reset(handle_ptr.get());
the correct way of initializing my handle_ unique_ptr?
解决方案 First of all, you should simply std::move
from the argument of the constructor to handle_
in the member initialization list:
BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)
: handle_(std::move(handle_ptr))
{ }
Second, std::make_shared
will give you a shared_ptr
, when you want a unique_ptr
. Unfortunately, there is no std::make_unique
(yet), so you'll have to do it like this:
BaseShader::BaseShader()
: BaseShader(std::unique_ptr<BaseHandle>(new BaseHandle()))
{ }
This will only work if BaseHandle
is derived from HandleInterface
.
这篇关于通过构造函数初始化unique_ptr的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!