Partage
  • Partager sur Facebook
  • Partager sur Twitter

Acesseurs et mutateurs C++

Acesseurs et mutateurs C++

Sujet résolu
    19 mai 2019 à 14:29:13

    Bonjour à tous,

    je suis debutant en C++

    c'est vrai , on m'a signaler que le tutoriel sur le site est depassé mais je veux toutes même continuer et récupérer tous ce qu'on peut m'enseigner.

    j'aimerais comprendre comment fonctionne les accesseurs en c++ mais j'ai une erreur pourtant je trouve mon code logique, le voici :

    Personne.h

    #ifndef DEF_PERSONNE
    #define DEF_PERSONNE
    
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    class Personne
    {
    public:
        Personne();
        Personne(string nom,string prenom,int age);
        string getNom() const;
        string getPrenom() const;
        int getAge() const;
        void setNom();
        void setPrenom();
        void setAge();
        void afficher() const;
    
    private:
        string m_nom;
        string m_prenom;
        int m_age;
    };
    
    #endif
    

    Personne.cpp

    #include<string>
    #include<iostream>
    
    #include "Personne.h"
    
    using namespace std;
    
    Personne::Personne():m_nom(""),m_prenom(""),m_age(0)
    {
    
    }
    Personne::Personne(string nom,string prenom,int age):m_nom(nom),m_prenom(prenom),m_age(age)
    {
    
    }
    
    Personne::getNom(){ return m_nom; }
    Personne::getPrenom(){ return m_prenom; }
    Personne::getAge(){ return m_age; }
    Personne::setNom(string nom):m_nom(nom){ }
    Personne::setPrenom(string prenom):m_prenom(prenom){ }
    Personne::setAge(int age):m_age(age){ }
    
    Personne::afficher(){
        cout <<"-------------------- "<<endl;
        cout <<"Nom: "<<m_nom<<endl;
        cout <<"-------------------- "<<endl;
        cout <<"Prenom: "<<m_prenom<<endl;
        cout <<"-------------------- "<<endl;
        cout <<"Age: "<<m_age<<endl;
    }
    




    quelqu'un svp pourrait m'expliquer en me disant comment ecrire ses getters et setters ??

    merci

    -
    Edité par alinftu 19 mai 2019 à 14:29:47

    • Partager sur Facebook
    • Partager sur Twitter
      19 mai 2019 à 15:14:52

      Salut !

      Il te faut préciser le type de tes accesseurs et de tes mutateurs dans ton .cpp :

      Au lieu de :

      Personne::getNom(){ return m_nom; }

      met :

      String Personne::getNom(){ return m_nom; }

      idem pour tes mutateurs. Ca devrait fonctionner ;)



      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2019 à 15:59:48

        merci Tomytoms pour ta reponse ,

        en moins d'avoir pas bien compris , mais xa ne marche pas :(

        -
        Edité par alinftu 19 mai 2019 à 16:01:53

        • Partager sur Facebook
        • Partager sur Twitter
          19 mai 2019 à 16:24:09

          Il faut mettre les const.
          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2019 à 16:25:20

            Bonjour, la signature de tes fonctions sont différentes dans le .h et le .cpp
            • Partager sur Facebook
            • Partager sur Twitter
              19 mai 2019 à 16:53:19

              Ok je me suis embalé un peu vite ! :lol: Plusieurs choses qui ne vont pas en relisant. j'ai testé dans mon coin et ca fonctionne.

              Ce que te mets dans le .h il faut le mettre dans l'implémentation dans le .cpp :

              .h :

              string Personne::getNom()const { return m_nom; }


              .cpp :

              String Personne::getNom()const { return m_nom; }
              ensuite, les getters tu leur met un paramètre dans le .cpp mais pas dans le .h :
              .cpp :
              string Personne::setNom(string nom)
              .h :
              string setNom(string nom);
              et pour finir quand tu retournes ou que tu veux un string en parametre ne mets pas de void mais string, idem pour l'age. tu demandes un entier met un entier en déclaration.
              .h :
              int setAge(int age);
              .cpp :
              int Personne::setAge(int age);
              Et pour finir j'ai juste affecté la bonne valeur :
              int Personne::setAge(int age){m_age = age;}
              Je pense que cette fois cela fonctionnera  :)
              • Partager sur Facebook
              • Partager sur Twitter
                19 mai 2019 à 17:07:30

                pourrais-tu me dire exactement ou est le probleme ?

                j'ai mis const mais xa pas marcher :

                #ifndef DEF_PERSONNE
                #define DEF_PERSONNE
                
                #include<iostream>
                #include<string>
                
                using namespace std;
                
                class Personne
                {
                public:
                    Personne();
                    Personne(string nom,string prenom,int age);
                    string getNom() const;
                    string getPrenom() const;
                    int getAge() const;
                    void setNom();
                    void setPrenom();
                    void setAge();
                    void afficher() const;
                
                private:
                    string m_nom;
                    string m_prenom;
                    int m_age;
                };
                
                #endif
                



                • Partager sur Facebook
                • Partager sur Twitter
                  19 mai 2019 à 17:11:59

                  Tu les a mis dans le .h mais pas dans le .cpp
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mai 2019 à 17:42:23

                    j'ai avancé grâce à vous , le getter ne crie plus sur moi.

                    voici les setters qui pose problème :

                    -
                    Edité par alinftu 19 mai 2019 à 17:42:50

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mai 2019 à 17:53:43

                      Le principe est le même que pour les getters.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mai 2019 à 18:20:54

                        pourrais-tu m’écrire pour la ligne 20 ?

                        je compléterais et saurais comment cela fonctionne .

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mai 2019 à 18:33:00

                          Salut,

                          Les listes d'initialisations...

                          Personnage::Personnage(int x) : m_x(x)

                          C'est réservé aux constructeurs. Pour tes setters, tu vas être obligé d'assigner manuellement la nouvelle valeur dans le corps de la méthode.

                          À part ça...

                          Si ton but est de mettre un accesseur et un mutateur sur chacun de tes membres, autant tous les mettre dans la portée publique !

                          -
                          Edité par Raynobrak 19 mai 2019 à 20:18:37

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 mai 2019 à 18:49:21

                            c'est on ne peut plus clair, je suis rassurer.

                            merci Raynobrak pour ta réponse.

                            -
                            Edité par alinftu 19 mai 2019 à 18:51:06

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 mai 2019 à 2:40:42

                              Si ta classe ne contient que des données et des accesseurs, qu'elle n'offre ni service, ni invariant, c'est que c'est juste une simple structure qui agrège des données.

                              Il faut savoir rester simple et ne pas tomber dans le piège de croire que les accesseurs sont un signe de bonne POO. Bien au contraire. La bonne POO, c'est quand on s'intéresse aux services, pas aux données.

                              J'ai la flemme de chercher des liens, c'est un sujet déjà débattu et rebattu..

                              • Partager sur Facebook
                              • Partager sur Twitter
                              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                20 mai 2019 à 9:22:16

                                C'est une maladie infantile du programmeur que de croire (*) que tout ce qu'il y a dans son code doit absolument être un Objet isolé du reste du monde avec des accesseurs/mutateurs. (**)

                                Si le service à rendre par un Truc est précisément de regrouper un Machin et un Truc, une structure avec des champs publics fait très bien le boulot

                                (*) avec le zèle dogmatique des débutants qui se raccrochent à des Principes Sacrés édictés par des gourous par peur d'être frappés par la foudre si ils y contreviennent.

                                (**) déjà, on sait bien que la visibilité c'est plus compliqué que ça. Si il y a "friend" en C++ + 3 niveaux d'accessibilité, et 4 niveaux en Java, c'est pas pour rien.

                                -
                                Edité par michelbillaud 20 mai 2019 à 9:24:41

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  21 mai 2019 à 10:16:19

                                  je suis débutant , et j'avais cru avoir la même base qu'en php sous symfony 3...bon ceci montre la particularité de c++ que je commence a aimer déjà

                                  -
                                  Edité par alinftu 21 mai 2019 à 10:22:55

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 mai 2019 à 10:20:45

                                    En fait, c'est pareil en PHP, ou tout autre langage objet.

                                    Il faut penser service, si tu ne pense pas service, tu vas briser les regles SOLID en 2 secondes.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Architecte logiciel - Software craftsmanship convaincu.

                                      5 novembre 2020 à 17:46:25

                                      Bonjour

                                      Je sais que le post est ancien mais je suis également entrain de suivre le cours C++ et en parcourant ce post j'ai vu qu'il y avait "using namespace std" à la fois dans le fichier h et à la fonction dans le fichier cpp de la Classe.

                                      Et dans le cours il est indiqué qu'il est déconseillé d'inclure cette ligne dans le fichier .h non....?

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Heureux les fêlés car ils laissent passer la lumière...

                                        5 novembre 2020 à 19:53:12

                                        Oui. Et ce n'est pas le seul endroit où le code présenté dans le cours ne respecte pas ce qui est expliqué dans le cours. (Sans compter ce qui n'est pas dit dans le cours, c'est probablement le pire)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 novembre 2020 à 0:25:50

                                          En vrai .h ou .cpp, n'utilise pas un using namespace std; c'est un mauvais raccourci qui est fait. Il n'y a aucun coup mémoire à rajouter std:: devant ta string.

                                          -
                                          Edité par SixtyOne 6 novembre 2020 à 0:26:27

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Ma chaine youtube, une notion de c++ en 5 min !

                                            6 novembre 2020 à 9:35:03

                                            SixtyOne a écrit:

                                            En vrai .h ou .cpp, n'utilise pas un using namespace std; c'est un mauvais raccourci qui est fait. Il n'y a aucun coup mémoire à rajouter std:: devant ta string.

                                            -
                                            Edité par SixtyOne il y a environ 8 heures


                                            Même dans les fichiers .cpp....?
                                            J'avoue que je le fait dans fichier main.cpp ainsi que dans les .cpp de mes classes. Mais dans les fichiers cpp des classes, il ne faudrait pas...?
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Heureux les fêlés car ils laissent passer la lumière...

                                              6 novembre 2020 à 10:20:40

                                              Ok, dans les .cpp cela peut être utile, voici un exemple :

                                              class MySwap
                                              {
                                              
                                              };
                                              
                                              namespace Util
                                              {
                                                  void swap(MySwap& _a, MySwap& _b)
                                                  {
                                                      std::cout << "Bonjour\n";
                                                  }
                                              }
                                              
                                              using namespace std;
                                              using namespace Util;
                                              int main()
                                              {
                                                  MySwap m {};
                                                  MySwap n {};
                                                  swap(m, n);
                                              }

                                              Ici ton compilateur va choisir la meilleur fonction à appeler pour swap, et dans notre cas il ne prendra pas la std::swap mais bien Util::swap. Mais pour moi ça reste un cas spécifique ou mettre ce using namespace dans ton .cpp est cohérent. 

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Ma chaine youtube, une notion de c++ en 5 min !

                                                6 novembre 2020 à 10:42:10

                                                Le problème de using namespace est qu'il copie tous les symboles accessibles d'un namespace dans un autre namespace et cela de manière irréversible. On peut se retrouver avec des conflits de nom entre la stl et notre code qui empêche le code de compiler, une mauvaise fonction utilisée, etc. Si les namespace existent, c'est justement pour éviter les conflits de nom.

                                                Dans un .h c'est très grave puisque tous ceux qui incluent ce .h subiront immédiatement using namespace. Dans un .cpp ce l'est moins car uniquement ce .cpp sera impacté. Mais les problèmes de conflits de nom, etc existe toujours est il est donc également déconseillé.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  6 novembre 2020 à 11:21:17

                                                  Juanito de Dironne a écrit:

                                                  Même dans les fichiers .cpp....?
                                                  J'avoue que je le fait dans fichier main.cpp ainsi que dans les .cpp de mes classes. Mais dans les fichiers cpp des classes, il ne faudrait pas...?


                                                  Non, de fait, il ne faudrait pas le faire, même dans les fichier .cpp...

                                                  La directive using namespace a été ajoutée pour répondre à un problème bien précis qui est apparu à un moment bien précis, et dont on peut partir du principe qu'il aura disparu "de lui-même" avec la première mise à jour des compilateur et de leur bibliothèque standard.

                                                  Cette "première mise à jour" des compilateurs et de leur bibliothèque standard a eu lieu il y a plus de vingt ans, et la raison d'être de cette directive a donc disparu à ce moment là.

                                                  La directive est restée uniquement parce qu'elle avait déjà été implémentée et que, bien que devenue inutile, il n'était pas nécessaire de la supprimer, ni de la norme, ni des compilateurs qui l'ont implémentée (dans un soucis de compatibilité ascendante ;) )

                                                  Tu trouveras toute une dissertation de ma part ==>ici<== pour te convaincre du problème ;)

                                                  • 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
                                                    6 novembre 2020 à 12:51:01

                                                    Nom de Zeus

                                                    Merci pour tout.

                                                    Avec le cours de C++ j'ai appris à utiliser "using namespace std" en comprenant une partie du "pourquoi".

                                                    Désormais je connais l'origine de ce "pourquoi".

                                                    Je le comprends et je comprends désormais quand certains prônent sa non utilisation.

                                                    Thank's a lot :)

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Heureux les fêlés car ils laissent passer la lumière...

                                                      6 novembre 2020 à 14:30:41

                                                      SixtyOne a écrit: > Ici ton compilateur va choisir la meilleure fonction à appeler pour swap, et dans notre cas il ne prendra pas la std::swap mais bien Util::swap. Mais pour moi ça reste un cas spécifique ou mettre ce using namespace dans ton .cpp est cohérent.

                                                      Aucune raison de mettre un using namespace pour une seule fonction, encore moins dans le namespace global. De plus, les fonctions utilitaires de ce genre devraient être dans le même namespace que la classe pour profiter de l'ADL, si on ne veut pas d'ADL, il ne faut surtout pas faire des using à tout-va.

                                                      un peu de lecture -> Utilisation de swap et des fonctions utilitaires en général

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 novembre 2020 à 14:48:57

                                                        (En pratique, tu verras pleins de projets avec des using namespace dans les .cpp. Mais chuttttt...)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          6 novembre 2020 à 16:17:58

                                                          Il y a aussi d'excellents ouvrages de programmation en C++ oû l'auteur a choisi délibérément de mettre un .hpp contenant using namespace std dans chaque programme, pour simplififier la vie des debutants avec un langage qu'il trouve un peu compliqué.

                                                          Mais bon, ce Stroustrup, il y connaît quoi, à la programmation ?

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            6 novembre 2020 à 16:54:06

                                                            Ca, par contre, je trouve contestable. Dans le sens où dire une chose et montrer du code qui fait autrement, c'est pas une bonne idée généralement. Osef que ce soit Stroustrup.

                                                            Surtout que ca doit être plus une contrainte liée au format papier, et pas réellement un choix de sa part. Je pense que même Stroustrup sait que cela pose un problème en termes pédagogique.

                                                            Sur les forums, sur les cours en ligne et dans les exos, on n'a pas cette contrainte, donc il n'y a aucune raison de faire cela.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              6 novembre 2020 à 17:52:53

                                                              Stroustrup enseigne depuis des années à des débutants.

                                                              La plupart des choses qu'on enseigne à des debutants, c'est inutile pour des professionnels (échanger des variables ?  Y a swap.  Etc) ou à la limite des mauvaises pratiques dans du développement industriel. Quoi, pas de tests unitaires pour hello world ?

                                                              Je saisis si tu as le bonheur d'enseigner à des débutants complets, mais ce qui les bloque au départ, c'est  le bombardement avec des tas d'informations et de contraintes - même avec les meilleures intentions d'en faire des professionnels compétents-  qui ne concernent pas les premières bases.  Le formateur n'est pas là pour étaler sa vaste connaissance de 50 points à la fois.

                                                              Dans l'enseignement des arts martiaux, les débutants et les 4ieme dan travaillent les mêmes mouvements. Le prof félicite les débutants qui ont réussi à différencier leur pied droit de leur main gauche, et les 4ieme dan se font engueuler parce que leur pied fait un angle de 10 degres de trop

                                                              -
                                                              Edité par michelbillaud 6 novembre 2020 à 18:40:43

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Acesseurs et mutateurs C++

                                                              × 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