我决定用C++做一个项目,因为我还不了解C++。我正在尽可能多地用C++做所有事情,这意味着很少有原始指针。
我在如何构建我的对象集合方面遇到了麻烦。公平地警告,这个描述将非常抽象。
- 一个类只有一个实例。我们称之为
Foo
- 这个CCD_ 2需要容纳
Bar
类的许多对象。需要快速插入和删除,不需要排序,所以我想使用一个集合 - 每个
Bar
正好拥有4个类型为Baz
的对象,这些对象在初始化时创建并固定 - 每个CCD_ 6具有指向CCD_ 7类型的许多其它对象的指针。出于实现原因,每个
Baz
还必须具有对拥有它的Bar
的引用 - 给定一个现有的
Baz
对象,我需要从Foo
的集合中删除相应的Bar
对象,并相应地释放内存。(我有一个算法保证,在删除时,拥有Bar
的Baz
对象只指向该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;
};
使用原始指针没有错,只要它们所指向的对象由智能指针或容器管理即可。
我在这个例子中使用了Foo
0,但是使用任何你觉得合适的。我怀疑std::vectors
可能会与std::set
竞争,因为它们使用连续内存,这在CPU兑现方面发挥得很好。