J'ai rencontré un problème intéressant tout en mettant en œuvre le modèle Observateur du C++ et STL. Considérons cet exemple classique:
class Observer {
public:
virtual void notify() = 0;
};
class Subject {
public:
void addObserver( Observer* );
void remObserver( Observer* );
private:
void notifyAll();
};
void Subject::notifyAll() {
for (all registered observers) { observer->notify(); }
}
Cet exemple peut être trouvé dans tous les livres sur les modèles de conception. Malheureusement, dans la vie réelle, les systèmes sont plus complexes, voici donc le premier problème: certains observateurs décider d'ajouter d'autres observateurs de l'Objet de la notification. Cela invalide la boucle "for" et tous les itérateurs, que j'utilise. La solution est plutôt simple - je faire un instantané de la observateurs inscrits de la liste et effectuer une itération sur l'instantané. L'ajout de nouveaux observateurs n'invalide pas l'instantané, donc, tout semble ok. Mais ici se pose un autre problème: les observateurs décider de détruire eux-mêmes sur d'en être informés. Pire encore, un seul observateur peut décider de détruire tous les autres observateurs (ils sont contrôlés à partir de l'scripts), et qui invalide la fois la file d'attente et un instantané. Je me retrouve à parcourir de-alloués pointeurs.
Ma question est comment dois-je gérer les situations, lorsque les observateurs se tuer les uns les autres? Il n'existe aucun prêt-à-utiliser des modèles? J'ai toujours pensé que "Observateur" est la méthode la plus simple motif de conception dans le monde, mais maintenant il semble qu'il n'est pas facile à mettre en œuvre correctement...
Merci à tous pour votre intérêt. Laissez-nous un résumé des décisions:
[1] "ne fais pas ça" Désolé, mais c'est un must. Les observateurs sont contrôlées à partir de scripts et sont récupérées. Je ne peux pas contrôler la collecte des ordures, afin de prévenir leur de-la répartition;
[2] "Utiliser boost::signal" les plus prometteuses de La décision, mais je ne peut pas introduire de boost sur le projet, de telles décisions doivent être prises par le chef de projet uniquement (nous sommes écrit, en vertu de la Playstation);
[3] "l'Utilisation partagée__ptr" Qui va empêcher les observateurs de l'allocation. Certains sous-systèmes peuvent compter sur la mémoire de la piscine de nettoyage, donc je ne pense pas que je peux utiliser shared_ptr.
[4] "Reporter observateur de libération de la mémoire" de la File d'attente des observateurs pour l'enlèvement tout en informant, puis utilisez le deuxième cycle pour les supprimer. Malheureusement, je ne peux pas empêcher la libération de la mémoire, donc j'utilise un truc de conditionnement de l'observateur avec une sorte de "adaptateur", en gardant en fait la liste des "adaptateurs". Sur destructeur, les observateurs annuler l'affectation de leurs adaptateurs, alors je prends mon deuxième cycle de détruire vide adaptateurs.
p.s. c'est ok, que j'ai modifier ma question de résumer tous les post? Je suis noob sur StackOverflow...