question sur les containers...

question sur les containers... - C++ - Programmation

Marsh Posté le 15-09-2003 à 17:54:29    

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.
 

  • 1ère solution :

Je ne modifie pas ma map et je rajoute un sujet statique à ma classe Foo.

Code :
  1. class Foo
  2. {
  3. public:
  4. void Change()
  5. {
  6. s.notify(FOO_CHANGED,this);
  7. }
  8. Foo()
  9. {
  10. s.notify(FOO_ADDED,this); // ouch, 'this' n'existe pas vraiment!
  11. }
  12. virtual ~Foo()
  13. {
  14. s.notify(FOO_REMOVED,this); // 'this' existe t'il encore ?
  15. }
  16. static Subject s;
  17. };


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.
 

  • 2ème solution:

Je crée une classe intermédiaire pour gérer la création et la suppression d'objets dans ma map.

Code :
  1. class FooMap
  2. {
  3. typedef std::map<Key,Foo> MapT;
  4. public:
  5. AjouterFoo( const Key& k, const Foo& f )
  6. {
  7. std::pair<MapT::iterator,bool> res = m_.insert( MapT::value_type(k,f) );
  8. s.notify(FOO_ADDED,/*pointeur vers le Foo inséré*/);
  9. }
  10. private:
  11. std::map<Key,Foo> m_;
  12. Subject s;
  13. };


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.
 

  • 3ème solution:

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
Reply

Marsh Posté le 15-09-2003 à 17:54:29   

Reply

Marsh Posté le 15-09-2003 à 18:02:13    

1) bien sur que this existe et est intègre des la { ouvrante

Reply

Marsh Posté le 15-09-2003 à 18:06:46    

et dans le 2) ca devrait aussi rouler
Dans le destructeur, this est encore valide. Si tout le traitement qui se fait apres sur le this que tu passe en parametre (via ton notify) se fait sequentiellement, devrait pas avoir de pb, non ?

Reply

Marsh Posté le 15-09-2003 à 18:08:47    

Taz a écrit :

1) bien sur que this existe et est intègre des la { ouvrante


oups... désolé... je me suis misérablement égaré en voulant trop réflechir...
J'ai lu récemment un article sur l'ordre des initialisations et j'ai pensé (stupidement) que cela s'appliquait ici !
Donc rien ne s'oppose à ce que j'utilise la première méthode ?


---------------
each day I don't die is cheating
Reply

Marsh Posté le 15-09-2003 à 18:09:54    

tu préfères pas wrapper par dessus tes Foo (avec un template) au lieu d'intréger le sujet ? d'ailleurs, le sujet, ne vaut t'il pas mieux que ce soit une référence

Reply

Marsh Posté le 15-09-2003 à 18:25:35    

Taz a écrit :

tu préfères pas wrapper par dessus tes Foo (avec un template) au lieu d'intréger le sujet ? d'ailleurs, le sujet, ne vaut t'il pas mieux que ce soit une référence


Humm... Il va falloir que tu m'expliques un peu là...
 
wrapper par dessus tes Foo = faire un class Foo : public Subject<Foo> ?
Si c'est ça le problème est que j'aurais un sujet par Foo donc que chaque observateur devra être enregistré auprès de chaque Foo. Or je souhaite n'avoir qu'un sujet pour tous mes Foo (et passer en paramètre à l'observateur le Foo qui a changé). De plus, les observateurs doivent s'enregistrer après la création du Foo donc il faut que je prévoie un autre moyen d'informer de la création d'un Foo.
 
d'ailleurs, le sujet, ne vaut t'il pas mieux que ce soit une référence : Une référence vers quoi ?
 
Bon ce n'est pas évident de se comprendre surtout parce que le problème est assez mal posé à la base. Si tu veut regarder (ou quelqu'un d'autre) je peut poster une implémentation réelle de ce que j'ai déjà fait.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 15-09-2003 à 18:35:53    

ben une référence vers un Sujet donné, je trouve pas ça propre de mettre le Subject comme tu fais. ben un wrapper tout bete, qui te sert à lié un objet de type T avec un Sujet donné.

Reply

Marsh Posté le 15-09-2003 à 18:54:52    

OK... merci pour ces idées. Je vais voir comment intégrer ça.


---------------
each day I don't die is cheating
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed