Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème modification [private]

Sujet résolu
    12 mai 2008 à 8:42:07

    Bonjour à tous,

    Dans mon projet c++, j'ai un problème avec plusieurs attributs publiques que je dois appeler en dehors de la classe.
    ...et ayant lu il y a quelques temps le tutoriel de M@teo21 sur c++ (surtout ce passage) :

    Citation : M@teo21

    En clair, si j'en vois un à partir de maintenant qui me met ne serait-ce qu'un seul attribut en public, je le brûle, je le torture, je l'écorche vif sur la place publique, compris ? :diable:
    Et vous, si vous voyez quelqu'un d'autre faire ça un jour, écorchez-le vif en pensant à moi, vous serez sympa


    ...je ne veux pas me mettre à dos "autant d'ennemis qu'il n'y a de programmeurs qui font de la POO dans le monde", mais je ne vois pas d'autre solution ^^
    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2008 à 8:50:36

      La solution est de faire des accesseurs (des fonctions publiques qui modifient les attributs privés).

      Ceci-dit, le tutoriel que tu cites est beaucoup trop extrême, il y a en réalité plein de situations où les attributs publiques se révèlent utiles. C'est dommage de donner à des débutants un point de vue aussi borné ; surtout qu'il y a plein d'autres sujets pour lesquels ce gentre de remarque serait plus juste :)
      • Partager sur Facebook
      • Partager sur Twitter
        12 mai 2008 à 9:36:24

        Ascenseurs : C'est pourtant ce que j'utilise !

        Active.h
        #ifndef DEF_ACTIVE
        #define DEF_ACTIVE
        
        #include <iostream>
        #include <string>
        
        class Active
        {
            public:
                Active();
                Active(std::string name, std::string slogan, int life, int offense, int defense, int speed);
                void get_hit(int damage);
                void attack(Active &target);
                void show_stats(Active &target);
                bool isDead();
        
        
            protected:
                std::string m_name;
                std::string m_slogan;
                int m_life;
                int m_offense;
                int m_defense;
                int m_speed;
        };
        
        #endif
        


        Hero.cpp
        #include "Hero.h"
        
        using namespace std;
        
        Hero::Hero() : Active()
        {
        
        }
        
        Hero::Hero(string name, string slogan, int max_life, int life, int offense, int defense, int speed) : Active(name, slogan, life, offense, defense, speed)
        {
        
        }
        
        void life_back(Hero &target) // C'est cette fonction qui pose problème
        {
            target.m_life = target.m_max_life;
            cout << target.m_name << " recovered all of is life." << endl;
        }
        


        Et ça me met : C:\Users\Valter\Desktop\Prince c++\Active.h:21: error: `int Active::m_life' is protected
        C:\Users\Valter\Desktop\Prince c++\Hero.cpp:17: error: within this context
        C:\Users\Valter\Desktop\Prince c++\Active.h:19: error: `std::string Active::m_name' is protected
        C:\Users\Valter\Desktop\Prince c++\Hero.cpp:18: error: within this context
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          12 mai 2008 à 10:10:43

          Ta fonction life_back est libre.
          Dès lors, elle na pas accès aux membres privés/protégés mais juste aux fonctions publiques. Il faut donc créer un accesseur pour ta variable m_name.
          • Partager sur Facebook
          • Partager sur Twitter
            12 mai 2008 à 11:16:07

            Mais comment créer un ascenseur pour m_name ?
            N'est ce pas ce que j'ai fais ?
            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2008 à 11:28:00

              pas un ascenseur mais un accesseur. Il s'agit simplement d'une fonction membre renvoyant la valeur de l'attribut m_name.
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                12 mai 2008 à 12:18:18

                Je suis censé la mettre où cette fonction ? dans Active(Personnage) ou Hero(Magicien ou Guerrier) ?

                Et il suffit que je mette return m_name; et remplacer le reste des m_name par le nom de l'accesseur ?
                • Partager sur Facebook
                • Partager sur Twitter
                  12 mai 2008 à 12:19:22

                  Elle doit être dans la classe dont tu aimerais connaître une information.

                  Ensuite, en effet, il faut passer par la fonction pour connaître m_name.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    12 mai 2008 à 12:29:58

                    pour faire un accesseur, tu as plein d exemples dans le tuto!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mai 2008 à 13:47:40

                      Aaaaaah d'accord ! Je crois commencer à comprendre ^^ En tout cas merci bien ;)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Problème modification [private]

                      × 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