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 :

chaine de caractères dans un enum


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 735
    Points : 544
    Points
    544
    Par défaut chaine de caractères dans un enum
    Bonjour à tou(te)s,

    J'ai entendu dire qu'en c++ il faut éviter les #define et utiliser les enum à la place. Grand bien me fasse, j'ai donc utiliser uniquement des enums.

    Par contre, là je suis bloqué : les enum ne peuvent contenir que des entiers, pas de chaine de caractères. Comment faire ca proprement alors ?

    Merci d'avance,
    Mindiell
    "Souvent, femme barrit" - Elephant man

  2. #2
    Membre averti

    Inscrit en
    juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 186
    Points : 347
    Points
    347
    Par défaut
    Avec des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const * const maVariableTexte = "La valeur de la variable texte";
    Didier

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 008
    Points
    13 008
    Par défaut
    Salut,
    En C++, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string const maVariableTexte = "La valeur de la variable texte"
    Dit autrement, ce ne sont pas les enum qui remplacent forcément des #define mais tout simplement une variable constante (joli oxymore) éventuellement statique.

  4. #4
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 735
    Points : 544
    Points
    544
    Par défaut
    Ah oui, mais ce n'est pas un peu dommage pour la structuration de ma classe ? (les enums font partie de ma classe, puisque ca la concerne directement)

    Et puis 328 constantes, je ne sais pas, ca me parait pas propre

    EDIT : surtout que j'appelle mes enums ainsi :
    SetToto (MonEnum::MaValeur);

    C'est plus parlant on sait tout de suite que MaValeur est une valeur de "type" MonEnum

    EDIT 2 : Impossible d'initialiser ma variable dans la déclaration de ma classe
    Mindiell
    "Souvent, femme barrit" - Elephant man

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 008
    Points
    13 008
    Par défaut
    Citation Envoyé par Mindiell Voir le message
    Ah oui, mais ce n'est pas un peu dommage pour la structuration de ma classe ? (les enums font partie de ma classe, puisque ca la concerne directement)
    La constante peut être dans la classe (en static). Il n'y a pas de pb.

    Citation Envoyé par Mindiell Voir le message
    Et puis 328 constantes, je ne sais pas, ca me parait pas propre
    Pourquoi ? D'autant qu'il y a de grande chance que ceci soit optimisé par le compilo.

    Citation Envoyé par Mindiell Voir le message
    EDIT : surtout que j'appelle mes enums ainsi :
    SetToto (MonEnum::MaValeur);

    C'est plus parlant on sait tout de suite que MaValeur est une valeur de "type" MonEnum
    Tu peux toujours associer un enum à une chaîne de caractère si tu le souhaites. Remarque que le define ne t'assurait pas un typage non plus.

    Quel est ton pb exactement ? Sérialiser ton enum en chaîne de caractères ? Utiliser des chaînes comme constantes mais vouloir garantir qu'elles sont bien celles que tu as définies ? Autre ?
    Citation Envoyé par Mindiell Voir le message
    EDIT 2 : Impossible d'initialiser ma variable dans la déclaration de ma classe
    Non, ce doit être dans le .cpp :
    .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct my_struct
    {
        static std::string const my_var;
    };
    .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string const my_struct::my_var("valeur");

  6. #6
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 735
    Points : 544
    Points
    544
    Par défaut
    Voici mon code, ca sera plus simple :
    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
    class Telnet : private sf::Thread
    {
    public :
        enum TelnetCommand
        {
            COMMAND_SE = 240,
            [bla bla bla]
            COMMAND_IAC
        };
        enum TelnetOption
        {
            OPTION_BINARY_TRANSMISSION,
            [bla bla bla]
            OPTION_EXTENDED_OPTIONS_LIST = 255
        };
        enum TelnetSubNegotiation
        {
            SUBNEGOTIATION_IS,
            SUBNEGOTIATION_SEND,
            SUBNEGOTIATION_INFO
        };
        //C'est ici mon souci :)
        enum TelnetTerminalType
        {
            ADDS_CONSUL_980 = "ADDS-CONSUL-980",
            [bla bla bla]
            ZENTEC_30 = "ZENTEC-30"
        };
    L'erreur étant, bien entendu :
    Citation Envoyé par Debug
    error: enumerator value for `ADDS_CONSUL_980' not integer constant
    Si je mets les std::string à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        std::string const ADDS_CONSUL_980 = "ADDS-CONSUL-980";
    L'erreur sera dans ce cas :
    Citation Envoyé par Debug
    error: ISO C++ forbids initialization of member `ADDS_CONSUL_980'
    error: making `ADDS_CONSUL_980' static
    error: invalid in-class initialization of static data member of non-integral type `const std::string'
    Mindiell
    "Souvent, femme barrit" - Elephant man

  7. #7
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 735
    Points : 544
    Points
    544
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct my_struct
    {
        static std::string const my_var;
    };
    Avec ca je ne pourrai pas utiliser une forme du type : my_struct::my_var ?
    Ca sera plutôt my_struct.my_var, non ?

    L'ennui c'est que j'ai tout le reste en enum.

    En même temps, en tapant ca, je viens de me rendre compte que je ne suis pas obligé d'avoir des chaines. Je ne les utilise qu'à un seul endroit finalement ! Je vais tester. Merci !
    Mindiell
    "Souvent, femme barrit" - Elephant man

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Avec ca je ne pourrai pas utiliser une forme du type : my_struct::my_var ?
    Ca sera plutôt my_struct.my_var, non ?
    C'est une variable statique, donc ce sera bien my_struct::my_var.

    Sinon une autre solution est d'avoir un enum dont les valeurs sont des entiers arbitraires (plutôt que des chaînes), et faire une fonction qui renvoie la chaîne associée à chaque valeur de l'enum. Ca te permet d'avoir une solution plus fortement typée et donc plus sûre (puisque l'utilisateur devra forcément passer un membre de l'enum et non une chaîne qui pourrait très bien être n'importe quoi).

  9. #9
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 735
    Points : 544
    Points
    544
    Par défaut
    Citation Envoyé par Laurent Gomila
    Sinon une autre solution est d'avoir un enum dont les valeurs sont des entiers arbitraires (plutôt que des chaînes), et faire une fonction qui renvoie la chaîne associée à chaque valeur de l'enum. Ca te permet d'avoir une solution plus fortement typée et donc plus sûre (puisque l'utilisateur devra forcément passer un membre de l'enum et non une chaîne qui pourrait très bien être n'importe quoi).
    Eh eh
    Je suis assez fier de moi-même : C'est exactement ce que je viens de tester !
    Je demande un enum, et j'ai une méthode qui retourne la std::string équivalente !

    Je suis aussi fort que Laurent !
    Mindiell
    "Souvent, femme barrit" - Elephant man

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

Discussions similaires

  1. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 15h28
  2. Remplacer une PARTIE de chaine de caractères dans un champ
    Par Turlututuchapopointu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/08/2005, 12h57
  3. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 12h51
  4. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 17h35
  5. chaines de caractères dans fichier .rc ou .res
    Par raggadoll dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/03/2004, 16h19

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