Partage
  • Partager sur Facebook
  • Partager sur Twitter

héritage et "protected"

l attribut mere ne va pas dans la classe fille???

Sujet résolu
    2 juin 2008 à 20:03:46

    salut a tous :)
    alors voila mon problème: j ai créé une classe Personnage, et une classe Guerrier qui hérite de la classe Personnage
    et mon probleme est que dans la classe Personnage, j ai créé un attribut "m_nom" dans la portée protected
    et je n arrive pas a l utiliser dans ma classe Guerrier
    alors voila mon code, c est plus parlant :p;)

    fichier: Personnage.h
    #ifndef DEF_PERSO
    #define DEF_PERSO
    
    
    #include <string>
    #include <iostream>
    #include <vector>
    
    class Personnage
    {
        public:
    
        Personnage(char race = 'p');
        Personnage(const Personnage &perso_a_copier, char race = 'p');
        Personnage(std::string nom, char race = 'p');
    
        ~Personnage();
    
        void recevoirDegats(long degats_subis);
        void changerNom(std::string nouveau_nom);
    
        std::string getNom() const;
        bool estVivant();
    
    
    
    
    
        protected:
    
    
        long m_vie;
        std::string m_nom;
        char m_race;
        long m_puissance_bouclier;;
    };
    
    
    
    
    
    
    
    #endif
    


    mes initialisations dans le constructeur sont faites comme ceci


    personnage.cpp
    #include <iostream>
    #include <vector>
    #include <string>
    
    #include "personnage.h"
    
    
    using namespace std;
    
    Personnage::Personnage(char race) : m_vie(100), m_nom("personnage inconnu"), m_race(race), m_puissance_bouclier(0)
    {
    
    }
    
    Personnage::Personnage(const Personnage &cop, char race) : m_vie(cop.m_vie), m_nom(cop.m_nom), m_race(race), m_puissance_bouclier(cop.m_puissance_bouclier)
    {
    
    }
    
    Personnage::Personnage(string nom, char race) : m_vie(100), m_nom(nom), m_race(race), m_puissance_bouclier(0)
    {
    
    }
    
    Personnage::~Personnage()
    {
    
    }
    



    puis donc voila mon code de guerrier.h

    #include <iostream>
    #include <string>
    #include <vector>
    
    #include "Personnage.h"
    
    
    class Guerrier : public Personnage
    {
        public:
    
        Guerrier();
        Guerrier(const Guerrier &g_a_c);
        Guerrier(std::string nom, std::string nom_arme = "lance pierres");
    
        ~Guerrier();
    
        void coupArme(Personnage &cible);
        void changerArme();
        void mettrePansement();
        void changerBouclier();
        void recharger();
    
    
    
    
        protected:
    
        std::string m_nom_arme;
        long m_degats_arme;
        long m_nb_pansements;
    
    
    
    };
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    #endif
    



    qui accompagne mon code

    guerrier.cpp
    #include <iostream>
    #include <string>
    #include <vector>
    
    #include "personnage.h"
    #include "guerrier.h"
    
    using namespace std;
    
    
    Guerrier::Guerrier() : Personnage('g'), m_nom_arme("lance pierres"), m_degats_arme(5), m_nb_pansements(50)
    {
    
    }
    
    Guerrier::Guerrier(const Guerrier &g_a_c) : Personnage(g_a_c, 'g'), m_nom_arme(g_a_c.m_nom_arme), m_degats_arme(g_a_c.m_degats_arme), m_nb_pansements(g_a_c.m_nb_pansements)
    {
    
    }
    
    Guerrier::Guerrier(string nom, string nom_arme) : Personnage(nom, 'g'), m_nom_arme(nom_arme), m_degats_arme(5), m_nb_pansements(50)
    {
    
    }
    
    Guerrier::~Guerrier()
    {
    
    }
    
    
    
    //_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_
    
    
    void Guerrier::coupArme(Personnage &cible)
    {
        cout<<m_nom<<" frappe "<<cible.m_nom<<" avec son arme"<<endl;
        cible.recevoirDegats(m_degats_arme);
    }
    



    le compilateur me marque une erreur dans le fichier guerrier.cpp
    error: within this context

    et dans Personage.h
    error : 'std::string Personnage::m_nom' is protected

    je n ai pas encore implémenté toutes les méthodes, et j aurais tres bien pu mettre cible.getNom(), mais normalement, ca devrait marcher le cible.m_nom non? car c est l attribut dune classe mère que j utilise dans une classe fille... :(
    je ne comprends vraiment pas pourquoi ca fait ca... o_O
    pouvez vous m'aider s'il vous plait?
    merci a tous et @++ ;)




    • Partager sur Facebook
    • Partager sur Twitter
      2 juin 2008 à 20:26:11

      Non, dans ce cas précis il est normal que Guerrier n'ait pas accès aux attributs protégés de Personnage. C'est une règle assez subtile, tout le monde se fait avoir ;)
      • Partager sur Facebook
      • Partager sur Twitter
        2 juin 2008 à 20:32:49

        pourquoi, parce que cible est une référence?
        • Partager sur Facebook
        • Partager sur Twitter
          2 juin 2008 à 20:35:12

          Si on définit la classe comme étant friend, elle pourrait accéder aux attributs non ?
          • Partager sur Facebook
          • Partager sur Twitter
            2 juin 2008 à 20:54:01

            friend constitue presque un bris d'encapsulation...

            Euh, ton fichier Guerrier.h ressemble beaucoup à Personnage.cpp... je peux voir le vrai fichier Guerrier.h?
            • Partager sur Facebook
            • Partager sur Twitter
              2 juin 2008 à 22:35:13

              Citation : Pas de titre

              pourquoi, parce que cible est une référence?


              Non, parce que cible est une autre instance et que tu accèdes à un attribut de Personnage et non Guerrier (ce n'est donc pas la même classe).

              Citation : Pas de titre

              friend constitue presque un bris d'encapsulation...


              Dans ce cas oui parce qu'utiliser friend serait abusif, mais dans le cas général friend est au contraire un moyen de permettre une meilleure encapsulation.
              • Partager sur Facebook
              • Partager sur Twitter
                4 juin 2008 à 18:01:59

                ca y est j ai édité mon guerrier.h
                et j ai compris pourquoi je ne pouvais pas utiliser l attribut, merci a tous de vos réponses ;)
                • Partager sur Facebook
                • Partager sur Twitter

                héritage et "protected"

                × 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