Учитывая это:с ++ удаление всех детей в структуре дерева, информируя родителей
class A {
public:
A()
~A()
void add(A *child);
void remove(A *child);
void set_parent(A *parent);
private:
A *parent;
std::list<A*> children;
};
add, remove
и set_parent
делают очевидным доступа списка или родительский атрибут.
Со следующим реализации:
A::A() : parent(nullptr){};
A::~A() {
//Keep the hierarchy clean and inform parent that we are gone now
if(this->parent != nullptr) {
this->parent->remove(this);
}
//Also delete all children as they would be lost now ...
for(A *child : children) {
delete child;
}
}
void A::set_parent(A *parent)
{
if(this->parent != nullptr)
this->parent->remove(this);
this->parent = parent;
}
На самом деле я не хочу делать что-нибудь более сложное, но проблема будет, что при удалении детей списка каждый из них информировать своих родителей, что они ушли в настоящее время, манипулируя списком, который мы сейчас итерируем. Что можно сделать?
У меня есть не добавил это к деталям, но прямо сейчас set_parent также информирует текущего родителя (если есть) о том, что ребенок изменил его владельца – salbeira
Вот почему вы должны поместить всю минимальную релевантную информацию в свой вопрос, вы можете получить как ub-оптимальный ответ. Во всяком случае, он может по-прежнему работать, если у вас есть способ «отсоединить» это уведомление. В конце концов, вы уничтожаете ребенка, нет никакой полезной информации в рассказе родителям о том, что ребенок меняет родителя (на nullptr, потому что он отделяет его). – roalz
Прошу прощения, я исправил его и для вашей «идеи» я добавил «если new_parent! = Nullptr» в условие set_parent – salbeira