我创建了两个类:Crane
和Container
。Crane
有一个私有成员unique_ptr<Container> container
和一个以unique_ptr<Container>
作为参数的公共方法load()
,如下所示:
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‘
我认为这就是你想改变对象所有权的方式吗?请帮帮忙。
发布于 2017-11-17 01:45:05
无法复制std::unique_ptr
(它的复制构造函数被删除)。允许复制将破坏其指针所有权的唯一性。
container
参数的load()
是通过值获得的,所以当代码将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()
为false时才能获得所有权,否则所有权将由调用方保留(例如,如果您想尝试将容器加载到不同的Crane
中)。
https://stackoverflow.com/questions/47341978
复制相似问题