Destruction d'objet problématique
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:
Code:
1 2 3 4 5 6
| class A {
A * parent = 0;
B * listener = 0;
void notifyEvent();
void addListener(B * b);
} |
Quand l'event est émis, la méthode B::receiveEvent() est appelée.
J'ai besoin d'une méthode permettant d'émettre des events à la chaine, à partir d'un objet A, et en remontant ses parents:
Code:
1 2 3 4 5 6
| void alert(A * a){
while( a ){
a->notifyEvent(); // (1)
a = a->parent; // (2)
}
} |
Le problème:
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).
Code:
1 2 3 4 5 6 7
| void alert(A * a){
while( a ){
A * parent = a->parent;
a->notifyEvent(); // (1)
a = parent; // (2)
}
} |
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é.
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.