 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
meow Guest
|
Posted: Fri Sep 23, 2005 7:53 am Post subject: de l'utilisation d'enum pour des masques |
|
|
Bonjour,
Je suis en train de coder une petite bibliothèque pour gérer des
streams au format .kin (kinemages). Il s'agit d'un format de fichier
destiné à la description d'objets 3D simples tels que les segments
les triangles, etc.
J'aimerai pouvoir gérer un mode d'affichage (fil de fer / plein /
points / ...) sur mes streams, et tant qu'à faire, autoriser un choix
multiple. Me sentant malin, dans ma classe kin_stream je définis donc
un
enum mode_type{ WIRED=1, PLAIN=2, DOTTED=4, ORIENT=8, NORMALS=16 };
Si mes souvenirs sont bons, C garantit que pour une variable enum il
sera donné assez de place pour stocker une valeur entière de la
taille de la puissance de 2 supérieure à la plus grande valeur
stockée dans l'enum. Les opérateurs | et & sont en outre valides...
Or en C++ le compilo me cherche des noises parce que enum n'apprécie
plus ces opérateur... de fait, je suis obligé de caster explicitement
mes expressions :
(mode_type)(GRID | PLAIN)
[*]
Ce qui me semble enlever un peu de souplesse en ce sens que j'aimerai
donner accès uniquement aux constantes (GRID,PLAIN,...) et que leur
type ne devrait pas à etre connu de l'utilisateur.
Que faire ? utiliser des defines ? ecrire une classe mod_type dans
laquelle définir les operateurs logiques ? C'est y pas un peu trop
bourrin ?
[*](j'ai cru comprendre qu'en C++ on est plus sensé faire ce genre de
casts à la C, qu'il y avait 4 operateur de cast à utiliser en place
de cela... Mais je n'ai pas encore pris le temps de me plonger dans ces
subtilité.)
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Fri Sep 23, 2005 12:50 pm Post subject: Re: de l'utilisation d'enum pour des masques |
|
|
meow wrote:
| Quote: | Je suis en train de coder une petite bibliothèque pour
gérer des streams au format .kin (kinemages). Il s'agit d'un
format de fichier destiné à la description d'objets 3D simples
tels que les segments les triangles, etc.
J'aimerai pouvoir gérer un mode d'affichage (fil de fer /
plein / points / ...) sur mes streams, et tant qu'à faire,
autoriser un choix multiple. Me sentant malin, dans ma classe
kin_stream je définis donc un
enum mode_type{ WIRED=1, PLAIN=2, DOTTED=4, ORIENT=8, NORMALS=16 };
Si mes souvenirs sont bons, C garantit que pour une variable
enum il sera donné assez de place pour stocker une valeur
entière de la taille de la puissance de 2 supérieure à la plus
grande valeur stockée dans l'enum.
|
Oui.
| Quote: | Les opérateurs | et & sont en outre valides...
|
Non. Ou plutôt, ils sont valides parce qu'il y a une promotion
en int.
| Quote: | Or en C++ le compilo me cherche des noises parce que enum
n'apprécie plus ces opérateur... de fait, je suis obligé de
caster explicitement mes expressions :
(mode_type)(GRID | PLAIN)
|
Tout à fait. Le résultat de GRID | PLAIN a le type int, et il
n'y a pas de conversion implicite d'in en un enum.
| Quote: | Ce qui me semble enlever un peu de souplesse en ce sens que
j'aimerai donner accès uniquement aux constantes
(GRID,PLAIN,...) et que leur type ne devrait pas à etre connu
de l'utilisateur.
Que faire ? utiliser des defines ? ecrire une classe mod_type
dans laquelle définir les operateurs logiques ? C'est y pas un
peu trop bourrin ?
|
Définir les opérateurs voulus :
mode_type
operator|( mode_type lhs, mode_type rhs )
{
return (mode_type)((unsigned)lhs | (unsigned)rhs ) ;
}
et la même chose pour &, si tu en as besoin.
| Quote: | [*](j'ai cru comprendre qu'en C++ on est plus sensé faire ce
genre de casts à la C, qu'il y avait 4 operateur de cast à
utiliser en place de cela... Mais je n'ai pas encore pris le
temps de me plonger dans ces subtilité.)
|
C'est une question de style. Pour des conversions de pointeur ou
de référence, oui ; je dirais que les nouveaux casts s'imposent.
Ici, en revanche, c'est vraiment une question de goût.
--
James Kanze GABI Software
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
|
|
| Back to top |
|
 |
meow Guest
|
Posted: Fri Sep 23, 2005 1:50 pm Post subject: Re: de l'utilisation d'enum pour des masques |
|
|
Ok... En meme temps c'est vrai que ça semble évident une fois
ennoncé.
Merci.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|