使用C ++智能指针构建多对多/双向引用

时间:2015-04-19 23:47:18

标签: c++ pointers smart-pointers

我决定用C ++做一个项目,因为我还不知道C ++。我试图尽可能地用C ++做所有事情,这意味着很少有原始指针。

我遇到了如何构建我的对象集合的麻烦。公平的警告,这种描述将非常抽象。

  • 只有一个类的实例。我们称之为Foo
  • Foo需要包含许多类Bar的对象。需要快速插入和删除,不需要订购,所以我想使用一套。
  • 每个Bar拥有4个Baz类型的对象,这些对象在初始化时创建并修复。
  • 每个Baz都有指向Baz类型的许多其他对象的指针。由于实施原因,每个Baz还必须引用拥有它的Bar
  • 鉴于现有的Baz对象,我需要从Bar的集合中删除相应的Foo对象并相应地释放内存。 (我有一个算法保证,在删除时,拥有Baz的{​​{1}}个对象仅指向Bar拥有的其他Baz个对象

我尝试实现它的方法是为Foo存储一组独特的Bar指针,处理多对多Baz关系的共享指针,以及Baz-> Bar关系的简单引用,每个Bar对象4个。问题是我无法再从Bar对象获取Bar unique_ptr。我有一个引用,但set remove方法需要Baz,因此不容易删除。有没有更好的方法来构建它,而不必诉诸手动指针/内存管理?

1 个答案:

答案 0 :(得分:2)

说实话,我不认为这里需要智能指针,因为所有对象都已经由容器管理 - 所以它们的删除是有保证的。

所以我只使用原始指针让容器完成它们的工作:

struct Baz
{
    struct Bar& bar;
    std::vector<Baz*> bazs; // no need to be smart - deleted elsewhere
    Baz(Bar& bar): bar(bar) {} // don't use bar in this constructor!
};

struct Bar
{
    std::array<Baz, 4> bazs;
    Bar(): bazs({*this, *this, *this, *this}) {}
};

struct Foo
{
    std::vector<Bar> bars;
};

使用原始指针没有任何问题,只要它们指向的对象由智能指针或容器管理。

我在这个例子中使用std::vector但是使用你认为合适的任何东西。我怀疑std::vectors可能与std::set竞争,因为它们使用连续的内存,可以很好地利用CPU兑现。