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

C++ Discussion :

enum dans une classe ?


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par d�faut enum dans une classe ?
    Bonjour,

    Je viens de m'apercevoir d'une caract�ristique bizzare de
    enum lorsqu'il est d�clar� dans une classe et utilis� dans
    une fonction membre statique. Par ex:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class MaClasse 
    {
      enum{VAR1, VAR2, VAR3};
      int uneVar;
      double uneAutre;
      etc...
       public:
     
     MaClasse();
     etc...
     
     static void staticFunc(void *data);
    }
    maintenant dans la fonction membre statique
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    void MaClasse::staticFunc(void *data)
    {
      MaClasse *p = (MaClasse*)data;
      p->uneVar;
      p->uneAutre = VAR3;   //ça marche !!??
    }
    Normalement il faudrait utiliser le pointeur p->VAR3 pour
    acc�der aux variable membre priv�es, non ?
    En tous cas je n'ai aucune erreur du compilo et mon
    appli semble fonctionner.

    Est ce que quelqu'un pourrait me dire si c'est normal ?

    Merci

  2. #2
    Expert confirm� Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par d�faut
    Je pense que tu ne comprends pas ce que tu fais.
    Le type �num�r� est une fa�on d'utiliser des nombres entiers sans le dire. Au lieu de dire "au bleu correspond 0","au blanc correspond 1","au rouge correspond 2".... on �num�re les mots qui tiendront lieu de valeur.

    "D�finir un objet" n'est pas "poss�der un objet".
    Ton mot cl� "enum" d�finit une s�rie de valeurs mais ce n'est pas un membre.

    A priori (mais c a v�rifier), tu changes la port�e de la d�finition de ton type �num�r� en le mettant dans la classe mais tu ne d�cris pas plus ton objet que tu as commencer � d�crire en �crivant le mot cl� class.

  3. #3
    Membre �m�rite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par d�faut
    c'est normal, ton enum n'est pas une variable membre, c'est un type.

  4. #4
    Membre �clair� Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par d�faut
    c'est normal, ton enum n'est pas une variable membre, c'est un type.
    Mais pourtant int et double sont des types aussi non ?
    Le truc c'est que je pensais que tout ce qui est dans la partie private
    ou protected d'une classe n'�tait plus accessible quelque soit le type.

  5. #5
    Expert confirm� Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par d�faut
    Citation Envoy� par tintin72 Voir le message
    Mais pourtant int et double sont des types aussi non ?
    tu n'as pas lu ma r�ponse.

    Oui, int et double sont des types.
    Mais quand tu �cris "int i", tu ne d�finis pas un type mais une variable de type "int"

    Quand tu �cris enum MonType{valeur1,valeur2} tu definis un type.
    Quand tu �cris "MonType i;", tu d�finis une variable de type MonType.

    Ici, tu n'as pas d�finis un membre de ta classe mais tu as d�finis un type utilisable dans ta classe (pour cr�er des membres ou non, d'ailleurs).

  6. #6
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Toute d�finition de type � l'int�rieur d'une classe n'a un effet que strictement similaire � ce qui se passe quand on d�fini un type dans un espace de nommage...

    Cela signifie que tu dois indiquer la port�e, mais tu garde tout � fait l'acces � ce type:

    Par exemple:
    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
     
    namespace MonEspace
    {
        class MaClass
        {
            public:
                MaClass(){}
             /*...*/
        };
        enum lenum
        {
            lavaleur1,
            lavaleur2 /*,
            ... */
        };
    };
    Si tu as la d�claration comme ci-dessus (et, bien sur, l'impl�mentation qui va avec , en dehors de toute directive d'utilisation d'espace de nommage (using namespace...), tu devra instancier un objet sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    MonEspace::MaClass objet;
    Si tu d�clare un type - quel qu'il soit (�num, class...) - en l'imbriquant dans une classe, tu devra tout simplement indiquer la port�e de la meme mani�re, � savoir qu'avec une classe du genre de
    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
    class LaClasseSommet
    {
        class LaClasseImbriquee
        {
            public:
                LaClasseImbriquee(){}
                /*...*/
        };
        enum lenumimbriquee
        { 
            val1,
            val2 /* ,
            ... */
        }
        public:
            LaClasseSommet(){}
            void LaFonction();
            /*...*/
    }
    Au sein de la classe, la port�e est... celle de la classe, ce qui fait que LaFonction sera impl�ment�e sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    void LaClasseSommet::LaClasseSommet
    {
        /* on a directement acces à l'énumération */
        lenumimbriquee ee=val1;
        /* tout comme à la classe imbriquée */
        LaClassImbriquee objet;
    }
    mais, par contre, dans une fonction qui n'est pas d�j� dans la port�e de LaClasseSommet, l'acces est l�, mais la port�e doit etre indiqu�e.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    LaClasseSommet::LaClasseImbriquee lobjet;
    LaClasseSommet::lenumimbrique lava=LaClasseSommet::val1;
    L'avantage �tant, tout comme l'utilisation d'un espace de nommage, que tu "limite" l'acces au type imbriqu� � la port�e... ce qui fait que tant le nom de la classe ou de l'�num�ration ou le terme repr�sentant la valeur �num�r�e pourra �tre r�utilis� (dans une autre classe ou un autre espace de nommage)
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

Discussions similaires

  1. Type enum dans une classe
    Par arthurembo dans le forum Langage
    R�ponses: 2
    Dernier message: 21/05/2009, 12h38
  2. passer un enum dans une classe
    Par dhoorens dans le forum C++
    R�ponses: 4
    Dernier message: 09/08/2008, 16h27
  3. declarer un enum dans une classe
    Par d-a-v-e dans le forum C++
    R�ponses: 15
    Dernier message: 10/02/2006, 00h46
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    R�ponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    R�ponses: 8
    Dernier message: 02/03/2004, 11h42

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