首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象从一个unique_ptr移动到另一个C++

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

Stack Overflow用户
提问于 2017-11-17 01:37:58
回答 1查看 2.5K关注 0票数 0

我创建了两个类:CraneContainerCrane有一个私有成员unique_ptr<Container> container和一个以unique_ptr<Container>作为参数的公共方法load(),如下所示:

代码语言:javascript
运行
复制
void Crane::load(unique_ptr<Container> container)
{
    if(isUnloaded())
    {
        this->container = move(container);
    }
}

我在这里的目标是给起重机一个可容纳的容器,因此其他Crane方法可以将当前持有的容器放在仓库中,检查它的id、重量等。

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

main()中,当我想调用crane.load(con)时,会得到以下错误:

错误:使用已删除的函数'std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&)和_Tp =_Tp;_Dp = std::default_delete‘

我认为这就是你想改变对象所有权的方式吗?请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2017-11-17 01:45:05

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

container参数的load()是通过值获得的,所以当代码将con变量传递给load()时,编译器试图复制-构造container,从而导致错误(如果仔细阅读,该错误是关于已删除的复制构造函数的抱怨)。

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

另一种方法是将load()改为引用container

代码语言:javascript
运行
复制
void Crane::load(unique_ptr<Container> &container)
{
    if(isUnloaded())
    {
        this->container = move(container);
    }
}

这样,crane.load(con);就能工作,并且只有当isUnloaded()为false时才能获得所有权,否则所有权将由调用方保留(例如,如果您想尝试将容器加载到不同的Crane中)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47341978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档