Désolé pour le titre qui n'est pas très explicite, mais le premier auquel j'avais pensé ne rentrais pas !
En fait, j'ai un container (une map) qui stocke des objets de type Foo.
Plusieurs objets peuvent ajouter de nouveaux objets Foo dans la map. Plusieurs objets doivent savoir quand un objet de type Foo est créé, modifié ou détruit.
J'ai donc pensé à utiliser le "pattern" de l'observateur. Le sujet (chaque instance de Foo) doit notifier tous ses observateurs de sa création, sa modification ou sa destruction.
Je ne modifie pas ma map et je rajoute un sujet statique à ma classe Foo.
Code :
- class Foo
- {
- public:
- void Change()
- {
- s.notify(FOO_CHANGED,this);
- }
- Foo()
- {
- s.notify(FOO_ADDED,this); // ouch, 'this' n'existe pas vraiment!
- }
- virtual ~Foo()
- {
- s.notify(FOO_REMOVED,this); // 'this' existe t'il encore ?
- }
- static Subject s;
- };
|
Le problème est que mes observateurs ont besoin d'accéder à l'objet Foo (d'où le this envoyé en paramètre). Or, dans le constructeur (et peut être pour le destructeur), l'objet n'est pas encore créé donc this n'existe pas. Je suis à peu près sûr que ça va marcher sur la majorité des compilateurs mais ce n'est pas standard.
Je crée une classe intermédiaire pour gérer la création et la suppression d'objets dans ma map.
Code :
- class FooMap
- {
- typedef std::map<Key,Foo> MapT;
- public:
- AjouterFoo( const Key& k, const Foo& f )
- {
- std::pair<MapT::iterator,bool> res = m_.insert( MapT::value_type(k,f) );
- s.notify(FOO_ADDED,/*pointeur vers le Foo inséré*/);
- }
- private:
- std::map<Key,Foo> m_;
- Subject s;
- };
|
Je n'ai pas vu de problèmes particuliers avec cette méthode, mais cela m'oblige à créer une classe tampon un peu inutile et allourdissant le tout.
J'ai essayé de voir si je pouvais créer une classe pour remplacer l'allocator de ma map. Cependant, je ne pense pas que cela soit la bonne solution.
Donc j'aimerais savoir si certains d'entre vous avaient une idée pour résoudre ce problème.
---------------
each day I don't die is cheating