Operateur++ sur un enum

Operateur++ sur un enum - C++ - Programmation

Marsh Posté le 26-08-2005 à 15:08:25    

J'ai donc un enum qui contient toutes mes étapes d'un genre de graph ou automate, j'ai besoin de l'incrémenter, j'ai donc essayer de créer un operateur++ en m'aidant de la doc, mais j'avoue ne pas du tout me sentir à l'aise avec ces définitions d'opérateur ...
Voilà ce que j'ai écrit :

Code :
  1. enum STATE_EXE { NO_ST, ...};
  2. friend const STATE_EXE& operator++( const STATE_EXE& a) { return ++a; }


 
l'opérateur est défini dans une classe, pas l'enum, je ne sais pas si c'est pour ça que j'ai dû mettre friend ... mais sinon j'ai ces erreurs :
midasctl.h(153) : error C2807: the second formal parameter to postfix 'operator ++' must be 'int'
midasctl.h(153) : error C2333: '++' : error in function declaration; skipping function body
 
 
Hormis ça cela compile, pas de pb, par contre à l'exécution de l'instruction de pré-incrémentation de la variable de type STATE_EXE j'ai un stack overflow la première fois, hors je suis largement dans les bornes de l'enum, et au 2ème passage c'est exception ...
Donc je dois mal définir cette opérateur je pense.
 
Merci.
 

Reply

Marsh Posté le 26-08-2005 à 15:08:25   

Reply

Marsh Posté le 26-08-2005 à 15:34:52    

t'es un drôle toi ... tu définis ++ en fonction de ++
 
et en plus, tu fous du const partout, mais tu modifies quand même ...

Reply

Marsh Posté le 26-08-2005 à 15:38:07    

Taz a écrit :

t'es un drôle toi ... tu définis ++ en fonction de ++
 
et en plus, tu fous du const partout, mais tu modifies quand même ...


 
 
Bah, oui, il définit un opérateur ++ postfixé, donc ca dépend du ++ préfixé non ? [:dawa]
 
(sinon, ce ne serait pas mieux de faire un itérateur qui sorte une à une toutes les valeurs possibles de l'enum ?)

Reply

Marsh Posté le 26-08-2005 à 15:44:03    

Pour le const ok ...
mais pour le reste je n'ai pas compris, et c'est un opérateur ++ préfixé que je cherche à définir.

Reply

Marsh Posté le 26-08-2005 à 16:06:16    

Ah vi ... je viens de comprendre d'où vient le pb et donc ta remarque Taz ;)
Mais je ne vois pas comment résoudre mon problème ...

Reply

Marsh Posté le 26-08-2005 à 16:17:15    

une réflexion philosophique:
l'enum a un nombre limité de valeur...
ton opérateur ne fait que l'incrémenter, donc à un moment ou à un autre, il va sortir de l'ensemble des valeurs de ton enum... c'est-à-dire que l'opétateur va retourner une valeur fausse et si ensuite, tu t'en sert comme l'index d'un tableau sans vérifier, tu obtiens une seg. fault ou une exception (et en passant, elle te dit quoi, cette exception?), etc.
 
PS. a++ est équivaut à a=a+1, non?

Reply

Marsh Posté le 26-08-2005 à 16:30:37    

Oui, mais comme je l'ai dit c'est une valeur d'étape, ça ne sert pas d'index de tableau ou autre, et je contrôle la  borne supérieur.
Et a=a+1 ça me demande égalemant un opérateur pour un enum, donc je tourne en rond ...

Reply

Marsh Posté le 27-08-2005 à 13:36:20    

une enum c'est une collection de constantes c'est pas fait pour subir des operations arithmétiques meme si l'idée du ++ semble attrayante.
de plus comment savoir si la prochaine constante est à +1 de la précédente.
 
exemple:

Code :
  1. enum
  2. {
  3. bitmask0 = 1,
  4. bitmask1 = 2,
  5. bitmask2 = 4,
  6. bitmask3 = 8
  7. };


 
me trompe-je ?
 
je me demande si il vaudrait pas mieux chercher un autre type que l'enum pour ton probleme :/


---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 27-08-2005 à 16:26:24    

clair, mais la mes enum(s) se suivent puisqu'ils représententent les étapes d'un graph.

Reply

Marsh Posté le 28-08-2005 à 23:36:46    

diverses solutions "génériques":
 

Code :
  1. enum monenum
  2. {
  3.   toto1,
  4.   toto2,
  5.   toto3,
  6.   toto4,
  7. };
  8. monenum GetNextEnum( monenum e )
  9. {
  10.   switch (e)
  11.   {
  12.   case toto1:
  13.     return toto2;
  14.   case toto2:
  15.     return toto3;
  16.   case toto3:
  17.     return toto4;
  18.   case toto4:
  19.     return toto1; // or throw exception.
  20.   default:
  21.     ! WTF.. traiter l'appelant de tous les noms.
  22.   }
  23. }


 
tu peux aussi stocker les valeurs dans un tableau (ou une map si tes valeurs sont éparpillées).
et faire un lookup dedans.
 
Sinon pour faire "+1" sur un enum, tu peux le convertir explicitement en unsigned int mais évidemment
ça ne marche que si les valeurs numériques de ta représentation se suivent exactement.
(compile time assert)

Reply

Marsh Posté le 28-08-2005 à 23:36:46   

Reply

Marsh Posté le 29-08-2005 à 09:16:27    

Pour l'instant j'ai effectivement fait un cast de sauvage ...
Merci.

Reply

Sujets relatifs:

Leave a Replay

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