J'ai appris Enums lorsque j'ai appris C et de temps en temps Je me souviens de cela et de la plupart du temps en re-lisant de certaines sources, je me suis produit que cela est dû au fait que je ne l'utilise jamais dans ma programmation, mon intérêt de programmation se concentre autour de la résolution de problèmes algorithmiques, donc je ne suis pas sûr où pourrait-je utiliser éventuellement des énums. p>
Quelqu'un pourrait-il suggérer un bon exemple où utiliser Enums est très facile? p>
J'apprécierais des exemples algorithmiques, mais les exemples algorithmiques ou non algorithmiques sont les bienvenus. P>
10 Réponses :
Je les utilise comme paramètres pour fonctionner par opposition à l'utilisation de booléens pour améliorer la lisibilité de mon code. P>
Jetez un coup d'œil au Justification sur Enum chez Wikipedia. P>
mérite de mentionner aussi: Types énumérées - Enums P>
Imaginez que vous programmiez une première recherche de profondeur et vous souhaitez marquer vos bords avec lesquels ils sont arborescents, arrière, avant ou croisement. Vous pouvez créer un Enum Edge_Type avec les quatre possibilités et l'utiliser pour marquer vos bords. P>
Bonjour Downvoter. Quelque chose en particulier que vous n'aimez pas de ma réponse?
Enums ont un avantage sur D'autre part, Certains auteurs de la bibliothèque utilisent une approche hybride de la première définition des constantes avec #define code>, mais c'est purement un détail de la mise en œuvre: Les debuggers peuvent généralement afficher / utiliser
Enum code> valeurs code> #define code> #define code> D Valeurs D.
#define code> a plusieurs avantages fondamentaux, dont l'une est que vous pouvez tester pour l'existence avec
#Ifdef code>. Ceci est utile si vous devez prendre en charge plusieurs versions d'une bibliothèque et utiliser éventuellement utiliser de nouveaux choix d'énormes si elles sont disponibles. P>
Enum code> ALORS: P>
#define FOO FOO
#define BAR BAR
J'ai démarré un projet personnel et je voulais identifier mon identifiant de paquet, il ressemble à ceci: et puis, quand je reçois un paquet, j'ai un énorme Commutateur qui ressemble à ceci pour traiter les paquets et les envoyer: p> C'est mon meilleur exemple, profitez :) P> P>
ouais, mais vous pouvez aussi bien avoir simplement utilisé #define code> s ou
statique const int code>'s
Lorsque vous décrivez / observant un attribut de certains systèmes, vous trouverez peut-être que l'attribut peut avoir une valeur d'un ensemble fort> fort> limitée. Nommez ces valeurs, attribuez chacune une valeur entière (code), les collectez-les dans une énumération et vous avez défini un type Exemple: Pour certains systèmes, nous pouvons considérer son état comme l'un de ses attributs. Nous pouvons l'observer et dire que cela peut être dans l'état «inaitalisé», l'état de «initialisation», l'état «actif» ou «inactif» (n'hésitez pas à ajouter plus d'États ici ...). Si vous souhaitez effectuer une action sur ce système, mais qui dépend de l'état actuel, comment passerez-vous des informations de l'état à cette action (fonction)? Vous pouvez transmettre des chaînes "nonInitialisé", "initialisation" ... mais plus efficace, simple et sûre des erreurs serait si vous ne passeriez qu'un seul entier d'un ensemble: p> Cette fonction aura l'état comme un argument et peut utiliser le commutateur lors de la décision de quoi faire en fonction de l'état actuel: P> à l'aide du type d'énumération pour décrire un ensemble limité de valeurs d'attribut est plus sûr puis en utilisant un ensemble de #defines et une variable entière. Par exemple. Si vous avez: p> et p> Rien ne peut vous empêcher d'attribuer une valeur entière à NSTE: P > si vous utilisez énumération: p> Vous ne pouvez pas l'affecter une valeur entière arbitraire, mais seulement un énumérateur (bien que le type sous-jacent L'énumération est entier! - voir Ceci ): P > state = Active;
Une autre alternative à Enum code> S peut rendre le code plus facile à lire et peut présenter une vérification de type de meilleure qualité lors de la compilation. p>
Problèmes avec Enums h2>
int code> ou
non signé INT code> et attribué à
ce genre de variables, donc
créer un trou dans la vérification de type
bénéfice. li>
Enum code> à
STD :: COUT CODE> Résultats dans le
Enum code>
converti en un entier puis imprimé
dehors. La plupart des implémentations doivent
effectuer une recherche de table pour convertir
le
Enum code> au texte avant l'impression. LI>
ol>
Alternatives h2>
Enum code> est d'utiliser une chaîne. J'ai travaillé dans des magasins où ils passent une corde constante au lieu d'un énumé. Un avantage est que la valeur nommée est toujours disponible, même lorsque les symboles de débogage ne sont pas. Il n'y a pas non plus de conversions requises lors de l'impression. p>
quelques inconvénients des chaînes: h2>
Switch code> Déclaration. Li>
En outre, avec Enums, vous pouvez les utiliser dans une classe pour déclarer des tableaux.
Une utilisation de Enums est de rendre le code plus clair sur le site d'appel. Comparez:
//Usage: Kick(false); void Kick(bool isCat) { if (isCat) { //Kick Cat } else { //Kick Dog } }
Avec tout cela sur l'utilisation de Enums sous forme de constante symbolique, j'aimerais souligner qu'en C ++ en utilisant Enum
Vous pouvez avoir une première valeur et sa dernière valeur et tout le reste entre ces valeurs. Le cas où dans le code vérifiez si vos valeurs sont comprises dans la plage. Maintenant, ajoutez de nouvelles valeurs à votre enum entre le premier et le dernier et ne vous permettez pas de modifier tous ces chèques!
typedef enum { First_value, Uninitialized, Initialization, Active, Idle, Last_value } my_type; void function(my_type state) { if ((state > First_value) && (state < Last_value)) { //Do stuff... } }
Related: dois-je utiliser #define, Enum ou const?
Enum a peu à offrir en C / C ++. Toutefois, dans C ++ 0X, des énumérations parfaitement dactylographiées résolvent ce qui ne va pas avec C / C ++ Enum.