IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

énumérations : tous les entiers fonctionnent ?


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 25
    Points
    25
    Par défaut énumérations : tous les entiers fonctionnent ?
    Bonjour !

    J'ai fait quelque tests sur les énumérations pour imiter un héritage des énumérations.
    J'ai fini par arriver à ce code, qui fonctionne parfaitement chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <iostream>
     
    using namespace std;
     
    class A
    {
    public :
     
    	enum Em_A { ZERO, ONE };
     
    	A(const Em_A& val = ZERO) : a(val) {}
     
    	int a_() const { return a; }
    protected :
    	Em_A a;
    };
     
    class B : public A
    {
    public :
     
    	enum Em_B { ZERO, ONE, TWO };
     
    	B(const Em_B& val = ONE) : A(static_cast<Em_A>(val)) {}
     
    	void seta(const Em_B& val) { a = static_cast<Em_A>(val); }
    };
     
     
    int main()
    {
    	A a;
    	B b;
     
    	cout << "a.a == " << a.a_() << " ; b.a == " << b.a_() << endl;
    	b.seta(B::TWO);		// Fonctionne si je mets : b.seta(static_cast<B::Em_B>(89));
    	cout << "a.a == " << a.a_() << " ; b.a == " << b.a_() << endl;
     
    	return 0;
    }
    Ce qui me trouble un peu, c'est qu'une énumération peut prendre un peu n'importe quel valeur dès qu'on fait un cast de int vers l'énumération.
    Or, je pensais jusqu'ici que les énumérations étaient limitées aux constantes qu'on lui donne.
    Dans mon exemple, l'attribut a de type Em_A peut prendre des valeurs en dehors de ZERO et ONE. Et ça fonctionne avec des entiers "hors sujets" comme 3, 5, 89.

    Une instance d'énumération serait donc tout simplement un entier ?
    J'ai lu je n'sais plus où qu'en C++0x (ou C++11), il y a un changement de comportement pour les énumérations et qu'elle n'étaient plus considérées comme des entiers.

    EDIT : corrections orthographiques.

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Citation Envoyé par loukiluk Voir le message
    Ce qui me trouble un peu, c'est qu'une énumération peut prendre un peu n'importe quel valeur dès qu'on fait un cast de int vers l'énumération.
    Or, je pensais jusqu'ici que les énumérations étaient limitées aux constantes qu'on lui donne.
    Si on a créé une énumération, c'est pour s'en servir directement. Ici (comme souvent), le cast me paraît être une très mauvaise pratique.
    Les énumérations "à la C" ont des défauts que les énumérations fortement typées de C++11 tentent de corriger.

    Citation Envoyé par loukiluk Voir le message
    J'ai lu je n'sais plus où qu'en C++0x (ou C++11), il y a un changement de comportement pour les énumérations et qu'elle n'étaient plus considérées comme des entiers.
    http://fr.wikipedia.org/wiki/C%2B%2B...nt_typ.C3.A9es

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le problème, c'est surtout qu'en C++ des opérations prenant en opérandes deux enums old-school retournent un entier au leu d'une enum de même type.

    Je pense surtout au bitwise-or (OU binaire bit-à-bit) qui est souvent utilisé quand une enum est constituée de flags.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    MErci pour vos réponses, c'est ce que je cherchais à savoir. Je ne compte pas "exploiter" ça mais la curiosité m'a poussé à chercher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tous les entiers de n chiffres
    Par nina2007 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 31/10/2012, 11h13
  2. Génerer tous les entiers d'une borne !
    Par fredigston dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 09/02/2011, 14h23
  3. Réponses: 0
    Dernier message: 13/10/2010, 13h44
  4. Générateur de tous les entiers naturels
    Par Zavonen dans le forum Général Python
    Réponses: 13
    Dernier message: 24/08/2010, 22h20
  5. Sélectionner tous les entiers dans une fourchette
    Par ludo.guy dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/07/2004, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo