Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

=?ISO-8859-1?Q?D=E9claration_d'enum_??=

5 réponses
Avatar
ALB
Bonjour =E0 tous,

Comment fait-on pour d=E9clarer un enum ? (...est-ce seulement
possible ?)

En pratique, je souhaite diminuer les d=E9pendances (et surtout les
temps de compilation, sans sacrifier les problemes de maintenance et
de perf) dans une situation du type suivant (il s'agit =E0 peu pr=E8s
d'une factory) :

dans un "OperationManager.h" j'ai le code suivant :

#ifndef HOperationManagerH
#define HOperationManagerH

class OperationBaseClass;
/* Si OP_ID =E9tait une classe, j=E9crirais "class OP_ID;" ici */

class OperationManager {
public :
OperationManager();
~OperationManager();
void register(OP_ID /*&*/ e, OperationBaseClass* op);
=2E..
};

#endif

j'ai un "op_id.h" qui contient :
typedef enum { OP0 =3D 0, OP1, OP2, OP3 , END} OP_ID;
j'ai =E9galement un "OperationBaseClass.h"


le OperationManager.cpp commence ainsi :
#include "OperationManager.h"
#include "OperationBaseClass.h"
#include "OperationDerive0.h"
#include "OperationDerive1.h"
#include "OperationDerive2.h"
#include "op_id.h"

OperationManager::OperationManager() {
register(OP0, new OperationDerive0());
register(OP1, new OperationDerive1());
register(OP2, new OperationDerive2());
/* ... */
}

OperationManager::~OperationManager() {
=2E.. /* nettoyage */
}

dans la d=E9claration de OperationManager::register, je pourrais
remplacer OP_ID par int et faire ensuite un cast de int vers OP_ID.
Y-a-t-il une solution (autre que de mettre la d=E9finition de l'enum
dans OperationManager.h) sans cast ?

Adrien Le Batteux

5 réponses

Avatar
Michel Decima

dans un "OperationManager.h" j'ai le code suivant :

#ifndef HOperationManagerH
#define HOperationManagerH

class OperationBaseClass;
/* Si OP_ID était une classe, jécrirais "class OP_ID;" ici */


En prenant cette remarque au pied de la lettre : tu pourrais transformer
OP_ID en une vraie classe, qui se contente d'encapsuler un enum, et qui
fournit aussi les operations necessaires pour servir de cle dans la
factory (au hasard, semantique de valeur et operateurs de comparaison).

Avatar
ALB
On 5 jan, 14:24, Michel Decima wrote:

dans un "OperationManager.h" j'ai le code suivant :

#ifndef HOperationManagerH
#define HOperationManagerH

class OperationBaseClass;
/* Si OP_ID était une classe, jécrirais "class OP_ID;" ici */


En prenant cette remarque au pied de la lettre : tu pourrais transformer
OP_ID en une vraie classe, qui se contente d'encapsuler un enum, et qui
fournit aussi les operations necessaires pour servir de cle dans la
factory (au hasard, semantique de valeur et operateurs de comparaison).


C'est ce que je souhaite éviter en fait.
L'idée de l'enum était de rester simple et de stocker les
OperationBaseClass* dans un OperationBaseClass* _array[END] et de ne
pas utiliser de map.


Avatar
Michel Decima

C'est ce que je souhaite éviter en fait.
L'idée de l'enum était de rester simple et de stocker les
OperationBaseClass* dans un OperationBaseClass* _array[END] et de ne
pas utiliser de map.



Ok. Dans ce cas, tu pourrais faire ceci:

// OperationManager.h
class OperationBaseClass;
class OperationKey;

class OperationManager {
public:
void register( OperationKey& e, OperationBaseClass* op );
};

// OperationKey.h
#include "op_id.h"

struct OperationKey {
OperationKey( OP_ID e ) : value( e ) {}
OP_ID value;
};

Avatar
ALB
On 5 jan, 15:28, Michel Decima wrote:

C'est ce que je souhaite éviter en fait.
L'idée de l'enum était de rester simple et de stocker les
OperationBaseClass* dans un OperationBaseClass* _array[END] et de ne
pas utiliser de map.


Ok. Dans ce cas, tu pourrais faire ceci:

// OperationManager.h
class OperationBaseClass;
class OperationKey;

class OperationManager {
public:
   void register( OperationKey& e, OperationBaseClass* op );

};

// OperationKey.h
#include "op_id.h"

struct OperationKey {
   OperationKey( OP_ID e ) : value( e ) {}
   OP_ID value;



};- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -


C'est un très joli contournement que je vais sans doute retenir (ça
m'apprendra à avoir mis au bagne les classes qui font des conversions
implicites).
Je perds neanmoins une copie d'entier : c'est terrible ;-)...

Merci.

Adrien


Avatar
James Kanze
On Jan 5, 1:58 pm, ALB wrote:
Comment fait-on pour déclarer un enum ? (...est-ce seulement
possible ?)


Sans énumérer ces membres ? Ce n'est pas possible -- même si le
type est incomplet, on peut définir un pointeur à lui, et sur
certaines architectures (assez exotiques aujourd'hui), il faut
que le compilateur sache les membres pour savoir la taille du
pointeur.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34