Поскольку удаление всех Bar
сек из Foo
следует удалить Foo
, это может действительно звук, как вам нужно несколько shared_ptr
с от Bar
с их Foo
,
Однако, эта модель поставит срок службы Foo
в руках его Bar
с: Вы не могли бы непосредственно удалить Foo
, вместо этого вы должны были бы выслеживать все его Bar
с и удалить эти.
Foo
будет держать Bar*
сек вместо unique_ptr<Bar>
с, так как он не может умереть, прежде чем его Bar
с. Но тогда вы должны дать право собственности на Bar
с до кого- ...
Вы могли бы закончить с еще одним объектом, который содержит коллекцию unique_ptr<Bar>
s, соответствующие каждому из Foo
с, но тогда вы должны держите все это в синхронизации, так как Bar
s приходят и уходят. Это то же самое бухгалтерия, которого вы пытаетесь избежать, но намного больше, сложнее и хрупче в результате, с утечками памяти и указателями изгоев в качестве случаев сбоя.
Таким образом, вместо всего этого, я предлагаю вам придерживаться первого unique_ptr
Приведено идеи. Первый переход на реализацию может выглядеть так:
struct Foo {
private:
friend void remove(std::unique_ptr<Foo> &foo, Bar const *bar);
// Removes the bar from this Foo.
// Returns true iff the Foo is now empty and should be deleted.
bool remove(Bar const *bar) {
auto i = std::find_if(begin(_bars), end(_bars), [&](auto const &p) {
return p.get() == bar;
});
assert(i != end(_bars));
_bars.erase(i);
return _bars.empty();
}
std::vector<std::unique_ptr<Bar>> _bars;
};
// Removes the bar from the Foo.
// Deletes the Foo if it becomes empty.
void remove(std::unique_ptr<Foo> &foo, Bar const *bar) {
if(foo->remove(bar))
foo.reset();
}
Кто владеет 'коллекции Foo'? Вероятно, это должно произойти удаление Foos. – drRobertz
Вы должны выполнить это условие по коду, это настолько специфично, что я сомневаюсь, что вы нашли бы «элегантный» идиоматический способ сделать это. Просто спроектируйте звуковую систему – Dredok
@Yaron Tausky: пожалуйста, посмотрите мой пост и отметьте его как точный ответ на свой вопрос! – Roland