我创建了2个类: Crane
和 Container
. 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 回答
std::unique_ptr
无法复制(其复制构造函数已删除) . 允许副本会破坏其指针所有权的唯一性 .container
的container
参数取值,因此当您的代码将con
变量传递给load()
时,编译器会尝试复制构造container
,因此错误(如果您仔细阅读,则会抱怨删除的复制构造函数) .您需要使用
crane.load(std::move(con));
,因此编译器可以移动构造container
,因此指针的所有权从con
移动到container
.另一种方法是改变
load()
以通过引用取代container
:这样,
crane.load(con);
将起作用,并且仅在isUnloaded()
为假时才取得所有权,否则所有权将保留在调用者处(例如,如果您想尝试将容器加载到不同的Crane
) .