将对象从一个unique_ptr移动到另一个C ++

时间:2017-11-17 01:37:59

标签: c++ codeblocks

我创建了2个课程:CraneContainerCrane有一位私人会员unique_ptr<Container> container和一个公共方法load()unique_ptr<Container>为参数,如下所示:

void Crane::load(unique_ptr<Container> container)
{
    if(isUnloaded())
    {
        this->container = move(container);
    }
}

我的目标是为起重机提供容器,因此其他Crane方法可以将当前持有的容器放入仓库,检查其ID,重量等。

现在,在main()我创建了2个对象:Crane crane;unique_ptr<Container> con(new Container(1));

main(),当我想致电crane.load(con)时,我收到此错误:

  

错误:使用已删除的函数&#39; std :: unique_ptr&lt; _Tp,_Dp&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,_Dp&gt;&amp;)[with _Tp = Container; _Dp = std :: default_delete&lt; Container&gt;]&#39;

我认为这是您想要更改对象所有权的方式吗?请帮忙。

1 个答案:

答案 0 :(得分:2)

std::unique_ptr无法复制(其复制构造函数已删除)。允许复制会破坏其指针所有权的唯一性。

container的{​​{1}}参数是按值获取的,因此当您的代码将load()变量传递给con时,编译器会尝试复制构造{{1因此错误(如果您仔细阅读,则会抱怨已删除的复制构造函数)。

您需要使用load(),因此编译器可以移动构造container,因此指针的所有权从crane.load(std::move(con));移动到container

另一种方法是改为concontainer改为参考:

load()

这样,只有当 container为false时,void Crane::load(unique_ptr<Container> &container) { if(isUnloaded()) { this->container = move(container); } } 才会生效,并取得所有权,否则所有权将保留在调用者处(例如,如果您想尝试将容器加载到其他crane.load(con);)。