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 :

[Langage] Déclarer une structure statique


Sujet :

Langage C++

  1. #1
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut [Langage] Déclarer une structure statique
    Salut,

    Je souhaite pouvoir accéder à une structure de ma classe de la façon suivante :
    Cependant, je n'ai aucune idée sur la méthode à employer pour déclarer une structure statique. L'exemple suivant ne compile pas :
    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
    class MaClass
    {
    private:
      static struct type
      {
        static const std::string type1;
        static const std::string type2;
        static const std::string type3;
      };
     
    public:
      static type t;
    };
     
    std::string MaClasse::t.type1 = "type 1";
    std::string MaClasse::t.type2 = "type 2";
    std::string MaClasse::t.type3 = "type 3";
    Quelle est la méthode pour déclarer ce type de structure ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Points : 379
    Points
    379
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MaClass
    {
    public:
        static const std::string type1;
        static const std::string type2;
        static const std::string type3;
    };
     
     
    /* Pour l'utilisation ailleurs */
    MaClasse::type1 = "type 1";
    MaClasse::type2 = "type 2";
    MaClasse::type3 = "type 3";
    Essaye ça, me semble déjà mieux.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Là, tu déclare une structure imbriquée dans ta classe, mais tu ne déclare pas le membre correspondant.

    En outre, on ne peut (me semble-t-il) pas utiliser le mot clé static si l'on ne déclare pas une variable ou une fonction.

    Il faudra donc prendre la précaution de:
    1. rendre les membres de la structure imbriquée statiques
    2. déclarer le membre de ta classe static (pour s'assurer que le membre soit indépendant de toute instance de la classe)
    3. ne pas créer une classe imbriquée anonyme

    Tu te trouvera dans la situation où deux écritures seront valides:
    • L'écriture "longue", la déclaration de la structure imbriquée et celle du membre statique sont clairement séparées:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      class MyClass
      {
          private:
              struct Type
              {
                   static std::string type1;
                   static std::string type2;
                   static std::string type3;
              };
              static Type type;
      };
    • L'"écriture courte": la définition de la structure imbriquée et la déclaration du membre de la classe sont "confondues"
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      class MyClass
      {
          private:
              static struct Type
              {
                   static std::string type1;
                   static std::string type2;
                   static std::string type3;
              }type;
      };

    L'initialisation se faisant de la meme manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* dans le "*.cpp" */
    std::string MyClass::type.type1="value1";
    std::string MyClass::type.type2="value2";
    std::string MyClass::type.type3="value3";
    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

  4. #4
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Salut,

    et aussi .... dans *.h

    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
     
    typedef	struct type
    {
      const std::string type1;
      const std::string type2;
      const std::string type3;
    };
     
    class MaClasse
    {
    private:
     
    public:
      static type t;
    };

    et dans *.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct type MaClasse::t = { "type 1", "type 1", "type 1" };
    Fredy "KRUGER"

  5. #5
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Là, tu déclare une structure imbriquée dans ta classe, mais tu ne déclare pas le membre correspondant.
    En fait, je fais la définition de ma structure dans la partie private et la déclaration du membre dans public... Ayant en tête de pouvoir accéder au membre mais pas directement à la structure...

    Mais bon je vais essayer de tout mettre dans public...

    EDIT: Ou la méthode de Fredy Kruger...

  6. #6
    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
    @Koala01: Est-ce normal que ta structure, dont la classe possède un champ statique, aie tous ses champs en statique ?
    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.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Fredy Kruger Voir le message
    Salut,

    et aussi .... dans *.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef	struct type
    {
      const std::string type1;
      const std::string type2;
      const std::string type3;
    };
    pour informaiton:

    En C++ la définition d'une structure implique automatiquement la déclaration du type associé.
    En outre, le typedef doit etre systématiquement associé à l'alias de type que l'on veut créer.
    et dans *.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct type MaClasse::t = { "type 1", "type 1", "type 1" };
    Là encore, le mot clé struct n'est pas nécessaire (j'en suis même à me demander s'il est seulement admis)

    En outre, la manière dont Spack présente les choses semble indiquer qu'il souhaite une structure imbriquée
    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

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    @Koala01: Est-ce normal que ta structure, dont la classe possède un champ statique, aie tous ses champs en statique ?
    Effectivement, je n'avais pas encore bu mon café, et, lors de mes essais, j'essayais d'initialiser le membre en lui donnant le type... std::string
    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
     
    class MyClass
    {
        public:
            struct Type
            {
                 std::string type1;
                 std::string type2;
                 std::string type3;
            };
            static Type type;
    };
    et dans le cpp
     
    MyClass::Type MyClass::type={"value1","value2","value3"};
    est effectivement tout à fait valide

    Citation Envoyé par Spack Voir le message
    En fait, je fais la définition de ma structure dans la partie private et la déclaration du membre dans public... Ayant en tête de pouvoir accéder au membre mais pas directement à la structure...

    Mais bon je vais essayer de tout mettre dans public...

    EDIT: Ou la méthode de Fredy Kruger...
    Rien ne t'empeche de définir le membre en accessibilité publique et la structure imbriquée en accessibilité privée, mais cela sous entend que, soit, tu devra recourir à la déclaration anticipée, soit, tu dois définir la classe imbriquée AVANT de déclarer le membre.

    Cela peut donc donner, au choix
    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 MyClass
    {
        /* private: peut etre omis ici car c'est l'accessibilité par défaut des
         * classes
         */
            struct Type
            {
                 std::string type1;
                 std::string type2;
                 std::string type3;
            };
        public:
            static Type type;
    };
    ou
    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
     
    class MyClass
    {
        /* private: */
            struct Type; /* nécessaire pour que le compilateur connaisse
                          * la structure Type lors de la déclaration du membre
                          */
        public:
            static Type type;
        private:
            struct Type
            {
                 std::string type1;
                 std::string type2;
                 std::string type3;
            };
    };
    Par contre, je me demande l'intérêt de fournir un membre en accessibilité publique si c'est pour que son contenu ne soit - de toutes manières - accessible qu'au sein de la classe.

    Es-tu sur que ce soit réellement ce que tu veux faire une accessibilité protected ne serait-elle pas la solution si le membre static se trouve dans une classe destinée à être dérivée
    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

  9. #9
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut
    Super ça marche merci...

    Citation Envoyé par koala01 Voir le message
    Es-tu sur que ce soit réellement ce que tu veux faire une accessibilité protected ne serait-elle pas la solution si le membre static se trouve dans une classe destinée à être dérivée
    Ben oui je pense que ça correspond bien à ce que je veux faire...

    Car je veux effectivement que l'utilisateur de la classe puisse utiliser le membre mais pas la structure en elle même car cela ne servirait à rien... Par contre le fait d'utiliser une structure me permet justement de structurer la présentation des données

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Te rend tu compte que cela revient à donner une caisse fermée à l'utilisateur, avec l'interdiction de l'ouvrir

    Quelle serait ta réaction dans cette situation Surement quelque chose comme "c'est bien, mais j'en fais quoi :question", non

    Dés lors, la question à deux cents: une telle boite est-elle réellement utile /nécessaire

    Si ta classe utilise cette structure en interne, mais que la structure en elle-même n'a, finalement, aucun usage externe, il n'y a pas de raison de placer le membre en accessibilité publique

    Les choses seraient différentes si tu créais une structure imbriquée en accessibilité publique, et le membre associé en accessibilité privée
    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

  11. #11
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut
    Effectivement, je n'ai peut être pas la bonne vision de la chose...

    Ce qui est vraiment utile c'est le membre de la structure. Celle-ci, n'est pas vraiment intéressante pour l'utilisateur de la classe. Car c'est le membre qui justement définie la valeur des différents types/champs de la structure.

    La structure n'a aucun intérêt hors de la classe puisque c'est le membre définit la valeurs des types sans qu'ils puissent être modifiés. Mais il n'est nullement nécessaire de créer par exemple un autre membre avec d'autres valeurs de types... Du coup l'accès à la structure en elle même n'a pas d'importance puisque c'est le membre qui est utile...

    Comme dans mon exemple j'ai une fonction qui accepte 3 types ma structures sert juste à regrouper mes types en un même point et pour utiliser la fonction on peut passer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasse instance = new MaClasse();
    instance->maFonction(MaClasse::t.type1, ...);
    Après l'utilisation du mot clé static n'est peut être pas nécessaire...

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    N'oublie pas que, de toutes manières, un membre statique fait partie intégrante de la classe, même s'il n'est pas dépendant d'une instance particulière de celle-ci...

    Cela signifie que tu n'a de toutes manières aucun besoin de passer la valeur représentée par ce membre en paramètre

    Et le membre peut donc être laissé strictement privé (ou protégé si tu envisage une hiérarchie d'héritage).
    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

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

Discussions similaires

  1. Initialisation d'une structure statique
    Par ottomucha dans le forum C++
    Réponses: 2
    Dernier message: 26/05/2014, 09h34
  2. Réponses: 16
    Dernier message: 14/01/2011, 20h41
  3. Déclarer une structure.
    Par enchanté dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/08/2007, 15h54
  4. [C#] déclarer une structure en static
    Par gdkenny dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/09/2006, 13h04
  5. [MFC][debutant] probleme pour déclarer une structure
    Par Robleplongeur dans le forum MFC
    Réponses: 10
    Dernier message: 21/02/2005, 13h29

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