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

标签 c++ codeblocks

我创建了 2 个类:CraneContainer . 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); 将起作用,并且仅当 isUn​​loaded() 为 false 时获得所有权,否则所有权与调用者保持一致(例如,如果您想尝试将容器加载到不同的 Crane)。

关于c++ - 将对象从一个 unique_ptr 移动到另一个 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47341978/

相关文章:

c++ - 如何运行多个源文件???需要帮助(C++代码块)

c++ - 通过从每一行中选择1个元素来查找2d数组中的最低和

c - Pthread 程序在 Codeblocks 和 Linux Kernel 上打印不同的值

c++ - 无法从字符串中获取数字输入

c++ - 归并排序的实现

c - 代码块中的调试

c++ - gmp_int boost 错误

c++ - 预先计算的树的树构建函数

c++ - 我在合并排序中传递这个数组的方式有什么问题?

c++ - 我如何使用像素位置 'x' (Halide::Var) 值作为 for 循环的限制?