Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1732 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  question sur les containers...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question sur les containers...

n°515111
gatorette
Posté le 15-09-2003 à 17:54:29  profilanswer
 

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
mood
Publicité
Posté le 15-09-2003 à 17:54:29  profilanswer
 

n°515118
Taz
bisounours-codeur
Posté le 15-09-2003 à 18:02:13  profilanswer
 

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

n°515123
chrisbk
-
Posté le 15-09-2003 à 18:06:46  profilanswer
 

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 ?

n°515125
gatorette
Posté le 15-09-2003 à 18:08:47  profilanswer
 

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
n°515126
Taz
bisounours-codeur
Posté le 15-09-2003 à 18:09:54  profilanswer
 

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

n°515141
gatorette
Posté le 15-09-2003 à 18:25:35  profilanswer
 

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
n°515146
Taz
bisounours-codeur
Posté le 15-09-2003 à 18:35:53  profilanswer
 

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é.

n°515161
gatorette
Posté le 15-09-2003 à 18:54:52  profilanswer
 

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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  question sur les containers...

 

Sujets relatifs
[question stupide] geters/seters [résolu, merci]Question sur les variables
URGENT : question sur PHP nukeune petite question fonctionnel sur le timestamp
[SNNS] Une question sur l'éditeur graphique.[c] question de newbie sur les typedefs
Question à 10 &#8364;[Access - VBA] - Question à la con avec la '
Question sur les type MYSQL[C] Question sur les union et gestion de priorités dans une expression
Plus de sujets relatifs à : question sur les containers...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR