如何对从unique_ptrs中提取的非拥有原始指针的向量进行建模



注意:如果标题不清楚,我很抱歉,我不知道如何用恰当的措辞表达这个问题(非常欢迎改进建议(。

代码,onlinegdb的工作版本示例和非工作版本示例首先简化解释:

#include <iostream>
#include <vector>
#include <memory>
class A {
public:
int v = 0;
};
void some_library_function(const std::vector<A*>& objects)
{
// do something to each object without taking ownership
for(auto p : objects)
{
p->v = 42;
}
}
class B
{
public:
std::vector<std::shared_ptr<A>> m_objects; // this is a private field in my actual code
B():m_objects{std::make_shared<A>()}{};
void use_library()
{
std::vector<A*> observer_vector(m_objects.size());
for(int i=0; i<m_objects.size(); i++)
{
observer_vector[i] = m_objects[i].get(); // fails here if I use unique_ptr
}
some_library_function(observer_vector);
}
};

int main()
{
B b;
b.use_library();
std::cout << b.m_objects[0]->v;
return 0;
}

我有一个库函数,它对通过std::vector<A*>传入的一系列A类对象进行操作。这些对象存储在拥有这些对象的类B的字段中。我想为";拥有";部分通过std::vector<unique_ptr<A>>的向量,但这使得无法将对象传递到库函数。使用shared_ptr是可行的,但我担心这在对象所有权方面不如unique_ptrs那么有表现力。

有没有一种方法可以在向量中使用unique_ptrs,并且仍然可以使用库函数?

您已经在做正确的事情了。原始指针是对未知或缺乏所有权的事物进行建模的一种非常合理的方式。你没有把矢量存储在任何地方,所以没有混淆,也没有风险。

这里唯一的问题是,你必须重新生成整个向量,这看起来有点浪费。最终,如果你在源端设置了vector<unique_ptr<A>>,而在目的端却被vector<A*>卡住了,那么你对此无能为力。如果矢量很小,那其实并不重要。


observer_vector[i] = m_objects[i].get(); // fails if with unique_ptr because of operator= being deleted

否,应该有效。你只是在分配一个原始指针。

相关内容

最新更新