我决定用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
,因此不容易删除。有没有更好的方法来构建它,而不必诉诸手动指针/内存管理?
答案 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兑现。