通过构造函数初始化unique_ptr [英] Initializing an unique_ptr though a constructor

查看:255
本文介绍了通过构造函数初始化unique_ptr的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  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>()){
}
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆