J'ai un système de fenêtre dans une interface graphique, et je ne suis pas sûr de la séquence de destruction. Chaque fenêtre est un vecteur tenant ses enfants, et chacun a aussi un pointeur vers son parent:Meilleure façon de supprimer la hiérarchie des fenêtres parent/enfant
auto root = new Window;
root->addChild(new Window);
root->addChild(new Window);
auto child = root->addChild(new Window); // Return value is the newly created Window
child->addChild(new Window);
child->addChild(new Window);
auto grandchild = child->addChild(new Window);
grandchild->addChild(new Window);
grandchild->addChild(new Window);
grandchild->addChild(new Window);
// Je veux supprimer le pointeur d'enfant, d'abord je dois effacer le pointeur de son enfant de parent de vecteur .
child->parent->children.erase(child->parent->children.begin() + child->positionInParentsVector - 1);
child->destroy();
void Window::destroy()
{
if (children.size() == 0) delete this;
else for (auto i : children) i->destroy();
}
OU avec des vecteurs de pointeurs intelligents, serait-il suffisant pour faire:
// Remove reference of child from parent's children vector, then
delete child;
J'ai lu qu'il est correct de faire supprimer ce. C'est difficile de comprendre.
pointeur intelligent serait probablement mieux il est tout nettoyé automatiquement. Cependant, si votre hiérarchie est * VERY * profonde, vous risquez d'avoir un débordement de pile dans les destructeurs. Dans ce cas, vous devrez tout libérer "manuellement" comme vous l'avez montré. –
Aussi, parce que la fonction destroy est récursive, et j'ai seulement besoin de supprimer la référence du parent une fois au plus haut niveau, cela signifie que je dois faire une fonction pour supprimer la référence, et une autre pour faire les suppressions récursives, non? Ce serait probablement trois fonctions, une removeReferenceAndDestroy, et dans celui-là removeReference, et ensuite le récursif destroy(). Il n'y a pas de manière plus élégante? – Zebrafish
Si le débordement de pile * est * un problème réaliste (cela se produira aussi pour une traversée récursive de la hiérarchie régulière) alors c'est en fait * pas * comme vous l'avez montré, vous devez le faire sans récursion mais avec des boucles. –