Partage
  • Partager sur Facebook
  • Partager sur Twitter

attribut classe parent innaccessible en protected

classe enfant ne peut afficher avec cout un attribut classe parent

Sujet résolu
    25 juin 2019 à 19:14:47

    Bonjour à tous

    Mon problème est le suivant, assez simple, mais j'ai dû mal à comprendre pourquoi (je commence juste)

    je vous mets le header du code concerné :

    #ifndef PERSONNAGE_H_INCLUDED
    #define PERSONNAGE_H_INCLUDED
    
    #include <iostream>
    #include <string>
    
    class Personnage
    {
    protected:
    
        std::string m_nom;
        int m_vie;
    
    public:
    
        Personnage();
        Personnage(std::string nom);
        ~Personnage();
    
        void statutPersonnage()const;
        void recevoirDegats(int nbDegats);
        void coup2poing(Personnage &cible)const;
    };
    
    class Guerrier : public Personnage
    {
    public:
    
        Guerrier();
        Guerrier(std::string nom);
    
        void bash(Personnage &cible)const;
    };
    
    
    #endif // PERSONNAGE_H_INCLUDED
    


    Quand j'essaye d'accéder depuis la fonction suivante, définie dans la classe enfant (Guerrier), un attribut de la classe parent (Personnage) pour l'afficher dans un cout, j'ai ce message d'erreur, comme si la valeur était private & innaccessible..

    void Guerrier::bash(Personnage &cible)const
    {
        cible.recevoirDegats(15);
        cout << m_nom << " bash " << cible.m_nom << " pour 15 degats" << endl;
    }
    C:\Users\Nek\Desktop\School\EPSI Prepa\C++ Projects\ProgObjetHeritage\Personnage.h|11|error: 'std::__cxx11::string Personnage::m_nom' is protected|

    + ici le morceau du main concerné :


    Si je passe l'attribut "std::string m_nom" en public j'ai plus de problème.. Vous avez une piste ? 

    Ps: C'est l'accès à l'attribut "m_nom" de la référence "cible" qui fait bugger le code, si je commente "cible.m_nom" dans le cout, ça compile

    Merci  de votre attention (:

    -
    Edité par Nektar_ia 25 juin 2019 à 19:58:58

    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2019 à 19:25:01

      Bon, ça sent l'exo tout pourri de la catastrophe que le cours de C++ d'OC, changez immédiatement de cours (faites une recherche sur ce forum pour avoir un cours correct du C++).

      Le plus probable, un slicing d'objet ou un manque de "virtualité".

      Comme le cours est pourri, il vous entraîne sur des problèmes trop complexe car utilisant des exemples très mal adapté.

      EDIT: bien plus claire avec le code de Guerrier.bash

      Le protected permet d'avoir accès aux champs au niveau de la même instance, ici cible est une autre instance.

      Généralement, la méthode de "rendu" n'est pas dans l'objet (la classe de l'objet) mais dans une fonction amie.

      -
      Edité par bacelar 26 juin 2019 à 11:05:34

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        25 juin 2019 à 19:33:25

        Damn... j'arrête pas d'entendre ça TT ça..

        Je voulais seulement finir le 2ème chapître, ce serait suffisant pour la rentrée je pense, mais même ça, semble-t'il, c'est trop lui demander..

        j'ai commencé une partie du cours ici : 

        Débuter en C++ moderne [C++, Qt, OpenGL, CUDA]

        mais le sommaire est tellement dense, avec des notions qui se touchent mais sont espacées de plusieurs chapîtres, j'ai un poil du mal à m'y retrouver..

        Si quelqu'un à un conseil pour bosser l'Objet/Class/Héritage/Polymorphisme, je suis preneur (:

        (& si quelqu'un voit l'erreur dans le code, je prends aussi)

        • Partager sur Facebook
        • Partager sur Twitter
          25 juin 2019 à 19:47:23

          Quand le guerrier bashe un autre personnage, le paramètre n'est pas le coeur parent à nous, mais le coeur de tous les cousins: mago, rogue...

          C'est donc normal que tu n'aies pas accès -- dans la philo C++.

          Rajoute-toi un getter sur le nom (ici, ça se tolère bien).

          -
          Edité par lmghs 25 juin 2019 à 19:47:38

          • 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.
            25 juin 2019 à 20:01:46

            J'avais cru comprendre que les accesseurs, c'était pour les fonctions hors classes, & hors classes héritées, & que justement, le mode "protected" dans l'héritage évitait de devoir passer par des accesseurs. J'ai tout compris de travers ? /fail
            • Partager sur Facebook
            • Partager sur Twitter
              25 juin 2019 à 21:52:13

              En fait protected te permet d'accéder à m_nom de Guerrier hérité de Personnage. mais pas m_nom d'un autre objet personnage (passé en paramètre).

              • Partager sur Facebook
              • Partager sur Twitter
                29 juin 2019 à 20:33:51

                Merci pour vos réponses, j'ai mis le sujet en résolu

                Ca n'a pas loupé, comme beaucoup le prédisent sur ce forum, le cours C++ d'OCR m'a appris les bases (mais époque C++11, donc obsolète), mais dès que ça se complique, je me suis légèrement noyé dans la confusion TT

                J'ai switché maintenant pour le cours du site "Zeste de Savoir" avec le cours de Guillaume Belz en complément quand j'ai besoin d'approfondissement.. ça s'annonce mieux, avec une bonne quantité d'excercices dans chaque chapitre.. appréciable

                • Partager sur Facebook
                • Partager sur Twitter

                attribut classe parent innaccessible en 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