OVH Cloud OVH Cloud

namespace et enum

44 réponses
Avatar
blc
Bonjour a tous (et a toutes aussi)

Je cherche a definir une "suite" de constantes.
Je fais un truc du genre:

namespace mon_namespace
{
class ma_classe
{
<...>
enum MON_ENUM
{
ABSOLUTE = 0,
SEMI_RELATIVE = 1,
RELATIVE = 2
};
}
}

1) Est ce que c'est, d'apres vous, une "bonne" facon de faire?
2) Si oui (mais je pense que non), j'ai un pb:
ABSOLUTE est deja declaree comme constantes dans certains headers ce qui
donne apres le preproceseur:
enum MON_ENUM
{
1 = 0,
SEMI_RELATIVE = 1,
RELATIVE = 2
};

ce qui ne marche pas forcement tres bien..;-)

Qq1 parmi vous aurait il un conseil pour eviter ce genre de problemes?

En esperant que ma question ne soit pas trop con...

Merci d'avance,
Benoit

4 réponses

1 2 3 4 5
Avatar
Bruno Personnel
blc wrote:
Bonjour a tous (et a toutes aussi)

Je cherche a definir une "suite" de constantes.
Je fais un truc du genre:

namespace mon_namespace
{
class ma_classe
{
<...>
enum MON_ENUM
{
ABSOLUTE = 0,
SEMI_RELATIVE = 1,
RELATIVE = 2
};
}
}

1) Est ce que c'est, d'apres vous, une "bonne" facon de faire?
2) Si oui (mais je pense que non), j'ai un pb:
ABSOLUTE est deja declaree comme constantes dans certains headers ce qui
donne apres le preproceseur:
enum MON_ENUM
{
1 = 0,
SEMI_RELATIVE = 1,
RELATIVE = 2
};

ce qui ne marche pas forcement tres bien..;-)

Qq1 parmi vous aurait il un conseil pour eviter ce genre de problemes?

En esperant que ma question ne soit pas trop con...

Merci d'avance,
Benoit



C'est une bonne manière de procéder, maintenant,
1. est ce que c'est opportun d'avoir des noms en majuscule ?
Personnellement, je considère que les noms en majuscule sont à éviter
sauf pour les #define. Les identificateurs d'enum sont de préférence en
minusucle et "_" pour séparer les mots.

2. si tu tiens à avoir les noms en majuscule, utilises tu la constante
ABSOLUTE, si ce n'est pas le cas, tu peux faire un #undef ABSOLUTE avant
que le compilo passe par ce code.

Cordialement

Bruno

Avatar
ben_cal
blc wrote:
Bonjour a tous (et a toutes aussi)

Je cherche a definir une "suite" de constantes.
Je fais un truc du genre:

namespace mon_namespace
{
class ma_classe
{
<...>
enum MON_ENUM
{
ABSOLUTE = 0,
SEMI_RELATIVE = 1,
RELATIVE = 2
};
}
}



Finalement, j'ai mis toutes mes constantes dans un namespace ce qui me
donne un truc du genre lorsque je les appelle:

MALIBNAMESPACE::CONSTANTS::default_value

L'avantage c'est que je vois tout de suite ou sont mes constantes et
elles n'auront pas tendance a s'egarer dans la nature...

Benoit

Avatar
Jean-Marc Molina
Bonjour Benoit,

L'avantage c'est que je vois tout de suite ou sont mes constantes et
elles n'auront pas tendance a s'egarer dans la nature...


C'est un peu anti-OO mais bon... Le principe c'est d'encapsuler ses données
dans les objets qui en ont besoin.
Ici rien ne lie tes enums à tes objets (sauf les préfixes et autres "mots
magiques"). Ça peut devenir très chaotique si tu adoptes cette logique à
d'autres concepts... On va se retrouver à programmer en C à cette allure :)

D'après mon exemple tu te retrouverais avec :

namespace mon_namespace
{
class ma_classe
{
<...>
enum MON_ENUM
{
MON_ENUM_ABSOLUTE = 0,
MON_ENUM_SEMI_RELATIVE = 1,
MON_ENUM_RELATIVE = 2
};
};
}

Niveau accès tu retombes sur :
mon_namespace::ma_classe:MON_ENUM_ABSOLUTE

Je pense que c'est bien plus logique qu'un :
MALIBNAMESPACE::CONSTANTS::ABSOLUTE

Surtout si tu accèdes à cette constante depuis la classe ma_classe. Et je ne
parle même pas des éventuels ENUM private dont tu auras sans doute besoin.

Je n'ai pas lu tous les commentaires mais j'espère que quelqu'un ne t'a pas
indui en erreur.

Dernières remarques, pourquoi affectes-tu des valeurs à tes attributs d'enum
? C'est le but de l'enum, fournir une valeur différente pour chaque
attribut, automatiquement. Par contre tu peux décider d'affecter une valeur
au premier attribut pour initialiser l'enum à une valeur donnée ou affecter
des valeurs différentes à chaque enum pour une raison ou une autre, je pense
aux masques utilisés par Microsoft par exemple (qui ne sont pas les seuls).

ABSOLUTE est deja declaree comme constantes dans certains headers ce qui
donne apres le preproceseur


J'ai relu ton message et j'avoue que je ne comprends plus ton problème.
L'enum est encapsulé dans une classe, pourquoi y aurait-il conflit ? Si tu
définis une autre classe ma_classe2 avec le même enum ça fonctionne, aucun
conflit.

Bonne journée,
JM

--
Clé AntiPourriel : PASUNPOURRIEL (ne pas retirer)

Avatar
ben_cal
Jean-Marc Molina wrote:

Bonjour Benoit,


L'avantage c'est que je vois tout de suite ou sont mes constantes et


elles n'auront pas tendance a s'egarer dans la nature...

C'est un peu anti-OO mais bon... Le principe c'est d'encapsuler ses données
dans les objets qui en ont besoin.
Ici rien ne lie tes enums à tes objets (sauf les préfixes et autres "mots
magiques"). Ça peut devenir très chaotique si tu adoptes cette logique à
d'autres concepts... On va se retrouver à programmer en C à cette allure :)

D'après mon exemple tu te retrouverais avec :

namespace mon_namespace
{
class ma_classe
{
<...>
enum MON_ENUM
{
MON_ENUM_ABSOLUTE = 0,
MON_ENUM_SEMI_RELATIVE = 1,
MON_ENUM_RELATIVE = 2
};
};
}

Niveau accès tu retombes sur :
mon_namespace::ma_classe:MON_ENUM_ABSOLUTE

Je pense que c'est bien plus logique qu'un :
MALIBNAMESPACE::CONSTANTS::ABSOLUTE
En fait, je viens de me rendre compte que j'ai "mixe" 2 prolemes en une

seule reponse ce qui est malheureusement frequent chez moi...si qq1
connait le nom exact de cette maladie, ca permettrait a mon medecin
d'avancer un peu plus vite...et inutile de repondre:
[HS] fr.comp.lang.c++.psychanalyse

;-D

Effectivement, pour ce qui est des enums particulier a une classe, ca
marche comme ca et c sans doute mieux mais j'ai forcement eu le meme
probleme avec des constantes que j'ai renommees (avec des minuscules
apres avoir considere les differents "combats" ayant eu lieu sur ce
thread...)et mises dans un namespace....pour etre sur...

Surtout si tu accèdes à cette constante depuis la classe ma_classe. Et je ne
parle même pas des éventuels ENUM private dont tu auras sans doute besoin.

Je n'ai pas lu tous les commentaires mais j'espère que quelqu'un ne t'a pas
indui en erreur.
Non, non, rassure toi, je me suis enduit d'erreurs tout seul..,-D



Dernières remarques, pourquoi affectes-tu des valeurs à tes attributs d'enum
?
Je ne me rappelle plus mais il me semble avoir entendu qu'il fallait

faire ca..mais j'avoue que je ne me souviens plus de la raison exacte...

J'ai relu ton message et j'avoue que je ne comprends plus ton problème.
L'enum est encapsulé dans une classe, pourquoi y aurait-il conflit ? Si tu
définis une autre classe ma_classe2 avec le même enum ça fonctionne, aucun
conflit.
En fait, il s'agit d'une macro qui avait le meme nom qu'une valeur de

mon enum et donc, le preprocesseur changeait le ABSOLUTE de mon enum en
1....

A+ et merci beaucoup,
Benoit


1 2 3 4 5