IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Accéder aux membres protected d'une classe de base à partir d'une methode d'une classe dérivée


Sujet :

Langage C++

  1. #1
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut Accéder aux membres protected d'une classe de base à partir d'une methode d'une classe dérivée
    Bonjour.

    Je dois coder un arbre avec possibilité de l'afficher.

    Pour cela j'ai une classe de base A et une classe dérivée B, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class A
    {
    protected:
      int m_val;
      A * m_ptr;
    };
     
    class B : public A
    {
    public:
      void draw(void)
      {
        A * ptr = m_ptr;
        ptr->m_val = 0;
      }
    };
    Le problème quand je compile est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foo.cpp: In member function ‘void B::draw()’:
    foo.cpp:6: error: ‘int A::m_val’ is protected
    foo.cpp:16: error: within this context
    C'est peut-être un problème de conception, mais j'aurai aimé garder quelque chose de simple et esthétique. Les solutions que j'envisage sont :

    (1) déclarer une fonction draw friend dans A (pas estéthique à mon goùt).

    (2) Caster m_ptr en B* au lieu de A* dans la fonction doSmth (c'est pas sécurisé du tout).

    (3) rendre les membres de A public et faire un heritage privé (problème suivant le nombre de niveau d'héritage et je perds les fonctions publiques de A).

    (4) Faire des accesseurs aux membres protected de A (beaucoup de travail mais certaienemt le plus élégant)

    Je vous consulte pour savoir si vous voyez une meilleure conception ou une meilleure solution.

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    je partage ton avis : la solution la plus "propre" me semble être

    (4) Faire des accesseurs aux membres protected de A (beaucoup de travail mais certaienemt le plus élégant)
    Eventuellement, tu peux déclarer ces accesseurs comme des fonctions membres protégées.

    Si tu veux gagner du temps, puisque la classe B hérite publiquement de A, peut-être peux-tu aussi déclarer la classe B comme amie de la classe A?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class A
    {
    protected:
      int m_val;
      A * m_ptr;
      friend class B;
    };
    L'un des problèmes de cette solution est que tu devras potentiellement le faire pour toutes les classes héritant de A ou B et qui veulent explicitement accéder à des données membres d'objets de type A.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Personnellement, pour accéder à une variable membre protected d'une instance autre que 'this' de la classe mère, j'utilise un accesseur statique dans celle-ci:
    http://yaronet.com/posts.php?sl=&s=109391&p=1&h=11#11
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Re,

    @Médinoc, pour ma culture personnelle : pourquoi faire un accesseur statique? C'est plus rapide?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il est statique, parce qu'on veut qu'il soit protected, qu'il a besoin d'accéder à autre chose que this, et qu'il n'a pas besoin d'accéder à this.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Re,

    Il est statique, parce qu'on veut qu'il soit protected, qu'il a besoin d'accéder à autre chose que this, et qu'il n'a pas besoin d'accéder à this.
    Ah oui d'accord!
    Et c'est mieux que de faire un mutateur protégé?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class A
    {
    protected:
      int m_val;
      A * m_ptr;
      void setVal(int const& val)
      {
          m_val=val;
      }
    };
     
    class B : public A
    {
    public:
      void draw(void)
      {
        A * ptr = m_ptr;
        ptr->setVal(0);
      }
    };

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    ^Ça compile, ça?

    Edit: Ben non.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2248: 'A::setVal' : cannot access protected member declared in class 'A'
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Re,

    ah bah non, je me suis retrouvé dans la même situation que valefor...

  9. #9
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Merci pour vos commentaires ! Je vais devoir me fendre d'accesseurs, c'est po juste

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    je reviens sur cette technique :

    Citation Envoyé par Médinoc Voir le message
    Personnellement, pour accéder à une variable membre protected d'une instance autre que 'this' de la classe mère, j'utilise un accesseur statique dans celle-ci:
    http://yaronet.com/posts.php?sl=&s=109391&p=1&h=11#11
    Je me demande si cela ne serait pas une bonne chose qu'elle apparaisse dans la faq?

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Hmm, possible.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/11/2011, 11h48
  2. Réponses: 3
    Dernier message: 29/03/2010, 17h01
  3. Accéder aux membres d'un WF depuis une custom activity
    Par Louis-Guillaume Morand dans le forum Windows Workflow Foundation
    Réponses: 4
    Dernier message: 13/12/2008, 08h50
  4. Réponses: 2
    Dernier message: 29/05/2007, 22h48
  5. Réponses: 16
    Dernier message: 17/03/2007, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo