Bonjour,
Je ne vois pas comment me sortir d'un problème de pointeur pouvant pointer sur un objet détruit, dans le cas suivant:
Le contexte:
J'ai des objets de classe A qui peuvent avoir un parent, de même classe, et qui de plus peuvent émettre un event:
Quand l'event est émis, la méthode B::receiveEvent() est appelée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class A { A * parent = 0; B * listener = 0; void notifyEvent(); void addListener(B * b); }
J'ai besoin d'une méthode permettant d'émettre des events à la chaine, à partir d'un objet A, et en remontant ses parents:
Le problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void alert(A * a){ while( a ){ a->notifyEvent(); // (1) a = a->parent; // (2) } }
J'aimerais donner la possibilité, à l'intérieur de B::receiveEvent(), de détruire (delete) l'objet A qui a émis l'évènement.
Mais si je fais cela, la ligne (2) peut provoquer une erreur, puisque l'objet pointé par a sera détruit au moment de son exécution.
Idées de solution, mais bof bof:
Je pourrais mémoriser avec un autre pointeur le parent de a, avant la ligne (1).
Ce qui résoudrait le problème, mais j'aimerais, dans B::receiveEvent(), pouvoir également détruire le parent de a, où tout ancêtre plus éloigné.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void alert(A * a){ while( a ){ A * parent = a->parent; a->notifyEvent(); // (1) a = parent; // (2) } }
Je pourrais introduire une methode A::destroy() qui marquerait un objet comme étant à détruire, et traiter les destructions une fois sorti de la boucle de alert().
Mais ne serait-ce pas introduire une spécificité d'utilisation de ma classe, source d'erreur en cas d'oubli, l'utilisateur devant penser à appeler destroy() plutôt que delete?
Est-ce que quelqu'un verrait une bonne solution ?
Merci.
Partager