Bonjour à tous,
Je suis en train d'implémenter le pattern Observer mais j'ai un gros soucis :
- Mon conteneur est une multimap.
1) Une de mes données change.
2) Celle-ci parcours sa liste d'écouteurs pour les notifier.
3) Une écouteur, d'après le changement de cette donnée, n'a plus besoin d'écouter, il se retire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 pair<multimap<Object*, Listener*>::iterator, multimap<Object*, Listener*>::iterator> range = mapListeners.equal_range(pObjectChanged); for(pair<multimap<Object*, Listener*>::iterator it = range.first; it != range.second; ++it) { it->second->NotifyChanged(it->first); }
-> Plantage car l'étape 2 commence une itération, il lance le premier évènnement, mais la réception de l'évennement provoque le retrait de l'élément concerné de la liste des écouteurs, donc lorsque j'incrémente l'itérateur du vector, ça plante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void Listener::NotifyChanged(Object* pObject) { if(pObject->GetRefId() != m_Id) { // Je ne référence plus cet objet, c'est terminé entre nous // Suppression du pointeur dans ma liste interne // Débranchement auprès de l'écouteur car ça n'a plus lieu d'être } }
Est-ce que si je pars de la fin vers le début en décrémentant mon itérateur ça pourrai fonctionner ?
J'aimerai bien tester mais je n'ai pas trouvé comment il fallait utiliser un reverse_iterator sur un multimap...
Pouvez-vous m'aiguiller ?
Merci
A bientôt
Partager