[cpp] conception sans friend

conception sans friend [cpp] - C++ - Programmation

Marsh Posté le 07-01-2010 à 11:34:31    


Bonjour,
 
Je voudrais faire une classe dont les données internes (et privées) serait modifiable suivant différentes stratégie (c'est d'ailleurs le nom du design Pattern)
Existe t'il une conception élegante pour ne pas utiliser friend ?
 
Voila ce à quoi j'avais pensé avec friend:
 

Code :
  1. class Object
  2. {
  3. friend IStrategie;
  4. int _data1;
  5. double _data2;
  6. //...  
  7. IStrategy *_strategy;
  8. void execute(){_strategy->execute(*this);}
  9. };
  10. class IStrategy
  11. {
  12. public:
  13. void execute(Object  & obj)=0;
  14. };
  15. class Strategy1 : public IStrategy
  16. {
  17. public:
  18. void execute(Object  & obj){obj._data1 = 2; /*ou tout autre valeur suivant algo*/}
  19. };
  20. class Strategy2 : public IStrategy
  21. {
  22. public:
  23. void execute(Object  & obj){obj._data2 = 1.23; /*ou tout autre valeur suivant algo*/}
  24. };


 
Probleme : this (et donc *this) est const et donc je ne peux pas le modifier ? faire un const_cast ??
Je dois déclare comme friend, IStrategy mais aussi Strategy1, Strategy2, ... et ce n'est pas l'idéal car je ne connais pas encore toute mes strategies...
Passer la/les valeurs modifier en retour/paramètres n'est pas envisageable non plus (je ne connais pas exactement le nombre de paramètres, ce n'est pas les mêmes utilisés par chaque stratégie...
 
Des solutions ? Des idées ?

Reply

Marsh Posté le 07-01-2010 à 11:34:31   

Reply

Marsh Posté le 07-01-2010 à 14:10:58    

fait des accesseurs pr les membres  modifiables de ta classe objet.

Reply

Marsh Posté le 07-01-2010 à 15:02:22    

sinon, tu peux avoir une interface privée à ton objet et lui attacher les stratégie (avec interface commune, donc), opération au cours de laquelle cet objet transmetun pointeur sur son interface privée à la stratégie ?


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

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