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 379
    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 379
    Points : 41 573
    Points
    41 573
    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

  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 379
    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 379
    Points : 41 573
    Points
    41 573
    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.

  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 379
    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 379
    Points : 41 573
    Points
    41 573
    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'

  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 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Hmm, possible.

+ 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