【发布时间】:2016-01-14 13:01:11
【问题描述】:
我有一个Bar 类和一些Foo 类的实例,其中包含Bar 对象的列表。我希望对底层Bar 对象进行任何更改,以更改Foo 列表中的Bar(所以副本是不可能的)。
是否可以避免使用带有 C++11 移动语义的指针?或者这种共享所有权是指针必不可少的情况之一?
指针实现:
struct Bar
{
public:
int someProperty;
};
class Foo
{
public:
std::vector<std::shared_ptr<Bar>> barList;
};
int main()
{
std::shared_ptr<Bar> pBar(new Bar);
Foo fooA;
Foo fooB;
fooA.barList.push_back(pBar);
fooB.barList.push_back(pBar);
pBar->someProperty = 5;
return 0;
}
例如,是否有一个单独的类拥有Bar 对象,然后Foo 对象具有对它们的引用列表?喜欢std::vector<std::reference_wrapper(Bar)> barList?还是在这种情况下会首选指针?
有人建议我在 C++ 中过度使用指针,应尽可能使用引用。
【问题讨论】:
-
如果您拥有 shared 所有权,那么您应该使用 shared_ptr
-
您不能真正拥有引用容器,无论如何也不能直接拥有。您也许可以使用例如
std::reference_wrapper和std::ref?但是std::shared_ptr制作是为了共享所有权。 -
它是原始的 owning 指针,应该避免。指针可能没问题(
observer_ptr可能更好)。 -
旁注:请习惯
auto pBar = std::make_shared<Bar>()