首页 文章

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

提问于
浏览
0

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

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

我的目标是给起重机一个容器来容纳,所以其他方法可以将当前持有的容器放在仓库中,检查其id,重量等 .

现在,在 main() 中我创建了2个对象: 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>&)[with _Tp = Container; _Dp = std :: default_delete <Container>]'

我想当你想要改变一个对象的所有权时,这就是这种方式?请帮忙 .

1 回答

  • 2

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

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

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

    另一种方法是改变 load() 以通过引用取代 container

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

    这样, crane.load(con); 将起作用,并且仅在 isUnloaded() 为假时才取得所有权,否则所有权将保留在调用者处(例如,如果您想尝试将容器加载到不同的 Crane ) .

相关问题