如何将unique_ptr的向量传递给函数

3
我如何将unique_ptr类型的向量传递给一个函数以访问每个对象的函数和变量?指针通过基类object指向派生类。例如,派生类为triangleplanesphere等。

到目前为止,我一直试图这样做:

void foo(vector<unique_ptr<object>>& shapes)
{
    // do something
}

但是,使用unique_ptr的问题在于它不能被复制。我不确定创建引用是否可行,但我认为必须使用move函数。或者,我不确定shared_ptr是否是一个好主意。这些对象是动态分配的。

不确定你在这里问什么。你发布的代码无法编译吗? - Nikos C.
1
你发布的代码没问题;如果你还有疑问,请发布一个最小可复现示例:https://stackoverflow.com/help/minimal-reproducible-example - M.M
JerSci:foo()是您可以更改的函数还是某个库中API的函数? 如果是后者,请共享该函数的真实签名。 Translated: JerSci:foo()是您可以更改的函数还是某个库中API的函数? 如果是后者,请共享该函数的真实签名。 - Ted Lyngmo
2个回答

3
如何将unique_ptr的向量传递给一个函数以访问每个单独对象的函数和变量
像你在问题中展示的那样去做。它可以正常工作。
这样做的问题是unique_ptr不能被复制。
这不是问题,因为unique_ptr并没有被复制。
我不确定shared_ptr是否是一个好主意。
不,除非你真的需要共享所有权,否则它们不是一个好主意。

问题在于我试图生成的 ppm 一直失败。我将其作为 foo(objects) 从主函数传递给 foo,其中 object 已经是一个 unique_ptr 的向量。我认为导致 ppm 无法生成的原因是我的代码中有一行将 unique_ptr 的所有权转移给另一个 unique_ptr。它是这样的: - JerSci
closest = move(shapes[j]),其中 j 是整数,shapes 是引用变量,而 closest 是对象类型的 unique_ptr。我不认为我可以使用一个引用变量来代替它,但我也不能确定。 - JerSci
我刚刚进行了调试,发现那一行是出错的原因。请帮忙? - JerSci
@JerSci 我不知道"ppm"是什么。我建议你提出一个新问题,并尽可能在可重现的示例中发布尽可能多的代码。这样人们就能看到你想要实现什么。 - Acorn

0
你可以使用 std::move 将指针移动到 vector 中,或者使用 ptr.get() 直接将原始指针放入 vector 中。在后一种情况下,请确保原始指针生存时间长于你调用的函数。如果你不确定,可以使用 shared_ptr 代替 unique_ptr

使用原始指针的示例:

void caller() {
    std::vector<object*> objs{uniqueptr1.get(), uniqueptr2.get()};
    foo(objs);
}

void foo(vector<object*>& shapes)
{
    ......//do something 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接