[c++]Détecter la modification de la valeur d'une variable

Détecter la modification de la valeur d'une variable [c++] - C++ - Programmation

Marsh Posté le 30-08-2006 à 11:25:11    

Bonjour,
 
J'aurai besoin de pouvoir détecter si la valeur d'une variable a été modifiée.
 
Je pensais pour cela encapsuler ma variable dans une classe template (pour avoir une seul classe pour les différents types de base) surchargant les différents opérateurs d'affectation (pour pouvoir utiliser l'objet de la même manière qu'un type de base), et qui modifierait un flag en cas de modification de la valeur de la variable.
 
Est-ce que ca vous parrait être une solution valable ou y a-t-il plus simple?


Message édité par pegasus32 le 30-08-2006 à 11:26:20
Reply

Marsh Posté le 30-08-2006 à 11:25:11   

Reply

Marsh Posté le 30-08-2006 à 11:34:38    

Salut !
 
Moi ce qui me paraitrait plus simple c'est a la place de la surchage de tes opérateurs c'est de faire tout bêtement une copie de ta variable et la comparer ensuite a chaque fois avec ta variable initiale.

Reply

Marsh Posté le 30-08-2006 à 13:33:32    

C'est plus simple c'est sur, mais j'aimerais bien avoir un système plus transparent ;) Je vais expliquer en gros le contexte:
 
Dans un objet donné (dérivant tous d'une classe de base), pouvoir définir des variables dont tout changement de valeur pourra être détecté par cet objet.
Et ce sans obliger le programmeur qui crée la classe à gérer lui même ces tests.
 
Le but final étant de récupérer les variables modifiées afin de pouvoir répercuter ces modifs sur une copie de cet objet situé sur un autre ordinateur.


Message édité par pegasus32 le 30-08-2006 à 13:35:35
Reply

Marsh Posté le 30-08-2006 à 13:37:14    

Un pattern observer/observable ?


---------------
Töp of the plöp
Reply

Marsh Posté le 30-08-2006 à 14:09:29    

_darkalt3_ a écrit :

Un pattern observer/observable ?


Tu veux faire dans le sens où les variables sont les observables, et ma classe est l'observer?
 
Ca reviendrait donc plus ou moins à ma 1ere solution, sans qu'au lieu de se mettre un flag, la variable signale son changement à sa classe via une methode de la classe de base.....effectivement c'est pas une mauvaise idée :)
 
Sinon ce que je dis n'est peut être pas très clair :D
Donc en gros j'essaie d'implémenter un système de ce type là :
http://developer.valvesoftware.com [...] _Variables

Message cité 1 fois
Message édité par pegasus32 le 30-08-2006 à 14:13:35
Reply

Marsh Posté le 30-08-2006 à 14:17:25    

pegasus32 a écrit :

Tu veux faire dans le sens où les variables sont les observables, et ma classe est l'observer?


 
ca voudrait dire que ta classe contenant la variable s'enregristre auprès d'un observer qui réagit en fonction de l'observation.
 
C'est un pattern particulier et bien défini, qui est largement documenté dans le Grand Ternet.


---------------
Töp of the plöp
Reply

Marsh Posté le 30-08-2006 à 15:49:57    

et il fonctionne comment l'observer dans ce cas ? Il faut bien le prévenir au moment d'affecter une nouvelle valeur à la variable observée...
 
Et il est dit que c'est l'objet lui-même qui doit être capable de détecter tout changement => surcharge du =

Reply

Marsh Posté le 31-08-2006 à 11:08:41    

J'ai un petit souci au niveau de la surcharge des opérateurs binaires...
Je les définis en dehors de la classe de la manière suivante :
 
template <typename U,typename V>
claNetVar<int> operator+(const claNetVar<U> &c1, const claNetVar<V> &c2)
{
    claNetVar<char> result = c1.getValue()+c2.getValue();
    return result;
}
 
Mais j'aimerais bien renvoyer le type réel résultant de l'opération, donc :
 
float+int=float
int+int=int
 
Je présume que le seul moyen est de surcharger l'opérateur + pour chaque type qu'on lui envoie? donc :
 
claNetVar<int> operator+(const claNetVar<int> &c1, const claNetVar<int> &c2)
claNetVar<float> operator+(const claNetVar<float> &c1, const claNetVar<int> &c2)
claNetVar<float> operator+(const claNetVar<int> &c1, const claNetVar<float> &c2)
...
 
Assez lourd quoi :D


Message édité par pegasus32 le 01-09-2006 à 08:07:01
Reply

Marsh Posté le 31-08-2006 à 19:29:12    

non, utilise des traits :
 

Code :
  1. template<class T1,class T2> struct return_type {};
  2.  
  3. template<> struct return_type<float,int>
  4. {
  5.    typedef float type_t;
  6. };
  7. template<> struct return_type<int,float>
  8. {
  9.    typedef float type_t;
  10. };
  11. template<class T> struct return_type<T,T>
  12. {
  13.    typedef T type_t;
  14. };
  15. template <typename U,typename V>
  16. claNetVar<typename return_type<U,V>::type_t>
  17. operator+(const claNetVar<U> &c1, const claNetVar<V> &c2)
  18. {
  19.     claNetVar<typename return_type<U,V>::type_t>  result;
  20.     res = c1.getValue()+c2.getValue();
  21.     return result;
  22. }


 
A affiner avec des detrompeur template et regarde du coté de boost::traits ou de LOKI.


Message édité par Joel F le 31-08-2006 à 19:29:29
Reply

Sujets relatifs:

Leave a Replay

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