我创建了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);
}
}
我的目标是为起重机提供容器,因此其他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;
我认为这是您想要更改对象所有权的方式吗?请帮忙。
答案 0 :(得分:2)
std::unique_ptr
无法复制(其复制构造函数已删除)。允许复制会破坏其指针所有权的唯一性。
container
的{{1}}参数是按值获取的,因此当您的代码将load()
变量传递给con
时,编译器会尝试复制构造{{1因此错误(如果您仔细阅读,则会抱怨已删除的复制构造函数)。
您需要使用load()
,因此编译器可以移动构造container
,因此指针的所有权从crane.load(std::move(con));
移动到container
。
另一种方法是改为con
以container
改为参考:
load()
这样,只有当 container
为false时,void Crane::load(unique_ptr<Container> &container)
{
if(isUnloaded())
{
this->container = move(container);
}
}
才会生效,并取得所有权,否则所有权将保留在调用者处(例如,如果您想尝试将容器加载到其他crane.load(con);
)。