我创建了 2 个类:Crane
和 Container
. Crane
有私有(private)成员(member)unique_ptr<Container> container
和一个公共(public)方法 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)
,我得到这个错误:
error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Container; _Dp = std::default_delete<Container>]'
我认为这就是您想要更改对象所有权的方式?请帮忙。
最佳答案
std::unique_ptr
不能被复制(它的复制构造函数被删除)。允许复制会破坏其指针所有权的唯一性。
load()
的container
参数是按值取值的,所以当您的代码将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
)。
关于c++ - 将对象从一个 unique_ptr 移动到另一个 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47341978/