Partage
  • Partager sur Facebook
  • Partager sur Twitter

constructeur avec enum

Sujet résolu
    19 décembre 2022 à 16:25:02

    Bonjour je dois ecrire le constructeur avec paramètre de ma class, le problème c'esrt q'un de mes attributs est de type enum et du coup je ne vois pas comment ça dois 

    s'écrire

    voici ma class:

    #ifndef MODALITE
    #define MODALITE
    
    class Modalite{
        private:
            enum{CM,TD,TP} mod;
            int capacite;
            bool distenciel;
        public:
            Modalite();
            Modalite(enum{CM,TD,TP},int,bool); // ici c'est pas bon
    
    };
    
    #endif



    Je vous remercie de votre aide 

    -
    Edité par Skyrel 19 décembre 2022 à 16:25:53

    • Partager sur Facebook
    • Partager sur Twitter
      19 décembre 2022 à 17:43:16

      Peut-être comme cela :

      enum Mod {CM,TD,TP};
      
      class Modalite{
          private:
              Mod mod;
              int capacite;
              bool distenciel;
          public:
              Modalite();
              Modalite(Mod,int,bool);
      };



      • Partager sur Facebook
      • Partager sur Twitter
      ...
        19 décembre 2022 à 17:46:24

        rouIoude a écrit:

        Peut-être comme cela :

        enum Mod {CM,TD,TP};
        
        class Modalite{
            private:
                Mod mod;
                int capacite;
                bool distenciel;
            public:
                Modalite();
                Modalite(Mod,int,bool);
        };

        non mod c'est pas un type c'est le nom de ma variable 



        • Partager sur Facebook
        • Partager sur Twitter
          19 décembre 2022 à 18:00:44

          Ok, mais "Mod" est un type, et "mod" est un champ. (variable, oui, mais ça veut pas dire grand chose, même qu'un champ, ça peut être constant, alors variable, mon cu*).
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            19 décembre 2022 à 18:06:30

            Autant pour moi j'ai mal lus la raiponce mais de toute façon la déclaration de la classe est imposé je ne peux pas la modifier, je dois juste écrire les constructeurs donc ça change rien à mon problème 

            bacelar a écrit:

            Ok, mais "Mod" est un type, et "mod" est un champ. (variable, oui, mais ça veut pas dire grand chose, même qu'un champ, ça peut être constant, alors variable, mon cu*).



            • Partager sur Facebook
            • Partager sur Twitter
              19 décembre 2022 à 18:33:08

              Ou alors :

              class Modalite{
                  private:
                      enum{CM,TD,TP} mod;
                      int capacite;
                      bool distenciel;
                  public:
                      Modalite();
                      Modalite(decltype(mod) ,int, bool);
              };



              • Partager sur Facebook
              • Partager sur Twitter
              ...
                19 décembre 2022 à 18:37:27

                Ça a un sens (voire même une utilité), une fonction avec paramètres dont le type n'est pas connu à l'extérieur de la fonction ?

                -
                Edité par michelbillaud 20 décembre 2022 à 10:49:31

                • Partager sur Facebook
                • Partager sur Twitter
                  19 décembre 2022 à 21:12:24

                  Salut,

                  Avant tout, il y aurait quelques questions intéressantes à se poser par rapport à l'énumération elle-même, comme:

                  Pourquoi avoir recours à une énumération impriquée?

                  voir

                  Pourquoi avoir recours à une énumération anonyme?

                  ou encore

                  Pourquoi avoir recours à une énumération privée ?

                  Comprenons nous bien, il n'y a aucun mal à choisir ces solutions, il faut juste arriver à déterminer si ... ces solutions sont adaptées à ta situation, surtout si les deux sont mises en oeuvre en même temps.

                  Car, à la base, une énumération est la conjonction de deux choses : son identifiant, qui représente un "concept général particulier", à l'instar de n'importe quel type défini par l'utilisateur, et les différentes valeurs énumérées, dont le but est de permettre la distinction entre les différentes situations dans lesquelles le concept (représenté par le nom de l'énumération) est susceptible de se trouver.

                  Sans oublier le fait que, accessoirement, le nom de l'énumération permet - à l'instar de n'importe quel type défini par l'utilisateur --d'identifier "sans l'ombre d'un doute" le type de la donnée qui sera manipulée.

                  Il est tout à fait "légal" (comprends: autorisé par le langage) de décider d'avoir recours à une énumération anonyme, cependant, il faut se rendre compte que cela limite énormément l'usage qui peut en être fait, étant donné que cela empêche systématiquement tout usage pour la connaissance du type de la donnée manipulée serait requis.

                  Cela nous amène "naturellement" à la deuxième question que j'ai mise en avant (en fait, à la première si on s'en tient à l'ordre dans laquelle je les ai proposées): pourquoi avoir recours à une énumération imbriquée?

                  Car, encore une fois, il s'agit d'une pratique tout à fait légale en C++. Seulement, cela impose de très sérieuses restrictions au niveau de l'énumération elle-même (et donc au niveau des valeurs énumérées qu'elle contient), dans le sens où cela implique très clairement que cette énumération n'a réellement de sens que quand on se trouve dans le cadre d'utilisation de la classe dans laquelle l'énumération est imbriquée.

                  Il n'est donc "cohérent" d'envisager l'imbrication d'une énumération dans une classe (ou dans une structure) que si l'on a la certitude que les valeurs énumérées que l'énumération contient ne pourront en aucun cas être utilisées dans un contexte différent que celui ... de la classe (ou de la structure) dans laquelle l'énumération est imbriquée.

                  Je ne dis, encore une fois, pas que tu as tord d'imbriquer ton énumération. je n'en connais pas assez sur ton projet que pour me faire une idée précise à ce sujet. Je me contente de poser la question de savoir si le concept représenté par l'énumération n'es effectivement destiné à être utilisé que dans le contexte de la classe dans laquelle elle est imbriquée. Et, bien sur, je t'invites à prendre les mesures adéquates en fonction de la réponse que tu donneras à cette réponse ;)

                  Le tout, sans oublier, bien sur, de répondre à la troisième question : Pourquoi avoir recours à une énumération privée?

                  Ce qui est chouette, c'est que le simple fait d'avoir recours à une énumération privée nous apporte deux raisons (valables?) pour avoir recours à une énumération imbriquée:

                  • on n'a pas d'autre choix que d'imbriquer l'énumération si on veut la définir dans l'accessibilité privée
                  • De par la nature "privée" de l'énumération elle-même, on peut avoir la certitude que cette énumération ne sera jamais utilisée que dans le cadre spécifique d'utilisation de la classe (ou de la structure) dans laquelle elle est imbriquée, pour une raison toute simple: il n'y aura que les fonctions membres de la classe (ou de la structure) qui pourront y accéder

                  L'inconvénient à opter pour cette solution, c'est que, par la nature privée de l'énumération, elle ne peut justement pas être rendue accessible depuis "l'extérieur" de la classe (ou de la structure) dans laquelle elle est imbriquée.

                  Il y a donc "une incohérence" à résoudre entre le fait de placer cette énumération dans l'accessibilité privée et celui de vouloir utiliser cette énumération comme paramètre d'une des fonctions de la classe, y compris s'il s'agit du constructeur.

                  A l'heure actuelle, tu n'as donc que deux solutions pour résoudre cette incohérence:

                  - Soit, tu considère que cette énumération a "de très bonnes raisons" d'être dans l'accessibilité privée de ta classe, mais, à ce moment là, il faut tenir compte des restrictions que cela impose, entre autres, le fait d'interdire l'utilisation de cette énumération comme paramètre au niveau des fonctions membre publiques (même si n'importe quelle fonction membre peut l'utiliser en interne, quel que soit son propre niveau d'accessibilité) car le public ne connait simplement pas l'énumération

                  - Soit, tu considère effectivement que cette énumération "a de très bonnes raisons" d'être accessible "depuis l'extérieur" de la classe (ou de la structure) dans laquelle elle est imbriquée, et tu as donc le choix de l'imbriquer (si l'énumération est clairement dépendante du contexte de la classe) dans l'accessibilité publique, soit de carrément pas l'imbriquer du tout (si l'énumération peut être utilisée dans un cadre n'ayant rien à faire avec la classe dans laquelle l'énumération est actuellement imbriquée).

                  Mettons nous bien d'accord: ne ne prétends absolument pas savoir si tu as raison ou tord d'agir de la sorte. j'ai juste essayé de te faire prendre conscience des restrictions que cette manière de faire t'impose, et, au delà, de te permettre de comprendre l'origine de ton problème actuel.

                  Et je veux juste t'inciter à te poser les bonnes questions (au bon moment) de manière à évaluer aussi objectivement que possible si tu as effectivement raison (ou non) d'agir ainsi ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                    20 décembre 2022 à 9:02:42

                    Si le enum est privé, tu ne peux pas le passer au constructeur. 

                    Met le enum en public (et par contre ton Mod mod toujours en privé).

                    Et de l'extérieur, tu pourras manipuler des Modalite::Mod

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      20 décembre 2022 à 10:47:44

                      Fvirtman a écrit:

                      Si le enum est privé, tu ne peux pas le passer au constructeur. 

                      Met le enum en public (et par contre ton Mod mod toujours en privé).

                      Et de l'extérieur, tu pourras manipuler des Modalite::Mod

                      Dans le genre

                      class Foo {
                      public:
                      	enum Thing {X, Y};
                      private:
                      	Thing my_thing;
                      public:
                      	Foo(Thing thing)
                      		: my_thing{thing}
                      		{}
                      };
                      
                      
                      int main() {
                      	Foo foo{Foo::X};
                      	return 0;
                      }


                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 décembre 2022 à 13:16:36

                        Bonjour je vous remercie de votre réponse et j'ai bien compris, le problème est que on m'a imposée cette écriture (c'est le sujet du devoir en c++ de l'année derrière) et qu'on me demande d'écrite un constructeur à trois paramètre. Du coup je peux pas mettre le enum en public. Est ce qu'il y a une autre solution ?


                        Fvirtman a écrit:

                        Si le enum est privé, tu ne peux pas le passer au constructeur. 

                        Met le enum en public (et par contre ton Mod mod toujours en privé).

                        Et de l'extérieur, tu pourras manipuler des Modalite::Mod



                        -
                        Edité par Skyrel 20 décembre 2022 à 14:26:18

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 décembre 2022 à 13:56:28

                          Skyrel a écrit:

                           le problème est que on m'a imposée cette écriture (c'est le sujet du devoir en c++ de l'année derrière) et qu'on me demande d'écrite un constructeur à trois paramètre. Du coup je peux pas mettre le enum en public. Est ce qu'il y a une autre solution ?

                          En faire la remarque à la personne qui a donné cet exercice, et qui est probablement le même idiot qui a posé le sujet de devoir de l'an dernier.

                          Idiot incompétent parce qu'il n'a même pas essayé de compiler le code qu'il a présenté.

                          $ g++ -c -Wall b.cc
                          b.cc:11:18: erreur: des types ne peuvent pas être définis dans des types de paramètres
                             11 |         Modalite(enum{CM,TD,TP},int,bool); // ici c'est pas bon
                                |                  ^~~~
                          


                          Conseil : faire preuve de diplomatie et/ou changer d'école.

                          -
                          Edité par michelbillaud 20 décembre 2022 à 14:02:56

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 décembre 2022 à 14:16:52

                            Skyrel a écrit:

                            Bonjour je vous remercie de votre raiponce et j'ai bien compris, le problème est que on m'a imposée cette écriture (c'est le sujet du devoir en c++ de l'année derrière) et qu'on me demande d'écrite un constructeur à trois paramètre. Du coup je peux pas mettre le enum en public. Est ce qu'il y a une autre solution ?

                            Raiponce, c'est une fille qui a les cheveux très longs. Tu voulais dire "réponse" ? 
                            Redonne nous exactement l'écriture qui est imposée.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                              20 décembre 2022 à 14:34:35

                              enfaite c'est bon j'ai trouvé, il faut juste donné un nom à l'enumérateur 

                              class Modalite{
                                  private:
                                      enum eMod {CM,TD,TP} mod;
                                      int capacite;
                                      bool distenciel;
                                  public:
                                      Modalite();
                                      Modalite(eMod,int,bool);

                              je vous remercie beaucoup pour votre aide 



                              Fvirtman a écrit:

                              Skyrel a écrit:

                              Bonjour je vous remercie de votre raiponce et j'ai bien compris, le problème est que on m'a imposée cette écriture (c'est le sujet du devoir en c++ de l'année derrière) et qu'on me demande d'écrite un constructeur à trois paramètre. Du coup je peux pas mettre le enum en public. Est ce qu'il y a une autre solution ?

                              Raiponce, c'est une fille qui a les cheveux très longs. Tu voulais dire "réponse" ? 
                              Redonne nous exactement l'écriture qui est imposée.



                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 décembre 2022 à 17:08:26

                                Tu lui envois quoi à ton constructeur quand tu l'appel ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                ...
                                  20 décembre 2022 à 17:16:29

                                  >en faite c'est bon j'ai trouvé, il faut juste donné un nom à l'enumérateur

                                  C'est pas possible, parce que tu nous as affirmé mordicus qu'il fallait prendre le code tel qu'il était....

                                  Rappel

                                  > mais de toute façon la déclaration de la classe est imposé je ne peux pas la modifier,

                                  Faudrait savoir....

                                  Donc si tu peux modifier la déclaration de la classe (*), tu déclares le type énumération (**)  comme public, ça ira mieux. On te l'a déjà dit, voir exemple plus haut.

                                  (*) qui est en fait une définition, pas seulement une déclaration

                                  (**) y a pas d' 'énumérateur"

                                  -
                                  Edité par michelbillaud 20 décembre 2022 à 17:22:42

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  constructeur avec enum

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown