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



我决定用C++做一个项目,因为我还不了解C++。我正在尽可能多地用C++做所有事情,这意味着很少有原始指针。

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

  • 一个类只有一个实例。我们称之为Foo
  • 这个CCD_ 2需要容纳Bar类的许多对象。需要快速插入和删除,不需要排序,所以我想使用一个集合
  • 每个Bar正好拥有4个类型为Baz的对象,这些对象在初始化时创建并固定
  • 每个CCD_ 6具有指向CCD_ 7类型的许多其它对象的指针。出于实现原因,每个Baz还必须具有对拥有它的Bar的引用
  • 给定一个现有的Baz对象,我需要从Foo的集合中删除相应的Bar对象,并相应地释放内存。(我有一个算法保证,在删除时,拥有BarBaz对象只指向该Bar拥有的其他Baz对象)

我尝试实现它的方法是为Foo存储一组唯一的Bar指针,处理多对多Baz关系的共享指针,以及Baz->Bar关系的普通引用,每个Bar对象4个。问题是,我再也没有办法从Baz对象中获取Barunique_ptr了。我有一个参考,但集合移除方法需要unique_ptr,因此不容易移除。有没有更好的方法来构建它,而不必求助于手动指针/内存管理?

老实说,我认为这里不需要智能指针,因为所有对象都已经由容器管理了,所以可以确保删除它们。

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

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;
};

使用原始指针没有错,只要它们所指向的对象由智能指针或容器管理即可。

我在这个例子中使用了Foo0,但是使用任何你觉得合适的。我怀疑std::vectors可能会与std::set竞争,因为它们使用连续内存,这在CPU兑现方面发挥得很好。

相关内容

  • 没有找到相关文章

最新更新