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

C++ Discussion :

Problème d'héritage d'une méthode protégée


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut Problème d'héritage d'une méthode protégée
    Bonjour, je me permet de demander de l'aide pour un problème que je rencontre dans l'un de mes programmes

    j'ai créé une classe de base, un objet général :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class CObject
    {
    public:
          CUIObject(void):m_pParent(NULL) {}
          virtual ~CUIObject(void) {}
     
       protected:
          void SetParent(CUIObject* pParent) { m_pParent = pParent; }
     
       protected:
          CObject*   m_pParent;
    };
    et ensuite je déclare une classe dérivée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class CObjetComplexe : public CObject
    {
       public:
          CObjetComplexe(void) {}
          virtual ~CObjetComplexe(void) {}
     
          void AddObjet(CObject* pObjet);
     
       protected:
          std::vector<CObject*>   m_arObjects;
    };
    dans CObjetComplexe je voudrais pouvoir indiquer à l'objet ajouté qui est son parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CObjetComplexe::AddObjet(CObject* pObjet)
    {
       m_arObjects.Add(pObjet);
       pObjet->SetParent(this);
    }
    mon problème est que je voudrais encapsuler la fonction SetParent dans CObject pour qu'elle ne soit pas accessible de l'extérieur mais dans AddObjet de CObjetComplexe j'ai une erreur en appelant SetParent si elle n'est pas publique

    auriez-vous une solution pour que SetParent soit une méthode accessible par CObject et ses héritiers mais pas par les autres ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  2. #2
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    Le design me paraît maladroit : CObjetComplexe est composé d'une collection d'objets CObject. L'affirmation "CObjetComplexe EST UN CObject" est fausse.
    Conclusion : l'héritage n'est pas approprié ici.

    mon problème est que je voudrais encapsuler la fonction SetParent dans CObject
    C'est là qu'elle devrait être effectivement, comme membre public.
    Les orteils servent à trouver les pieds de chaise et les montants de porte quand il fait noir.

  3. #3
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    Citation Envoyé par BertrandA
    Le design me paraît maladroit : CObjetComplexe est composé d'une collection d'objets CObject. L'affirmation "CObjetComplexe EST UN CObject" est fausse.
    Conclusion : l'héritage n'est pas approprié ici.
    Sachant que CObject est une base et que je vais créer des héritiers qui vont eux même contenir d'autres objets qui ne seront pas les mêmes je ne comprend pas comment je pourrai faire sans utiliser l'héritage

    j'ai CWnd qui est un CObject dérivé auquel j'ai ajouté la possibilité d'ajouter d'autes objets
    et j'ai CButton qui est un autre CObject dérivé qui n'aura pas la possibilité de contenir de CObjet

    je pourrai ajouter des CWnd et des CButton à un objet CWnd mais pas à CButton
    CObject a une méthode virtuelle pure appelée "Draw" qui est redéclarée par chaque dérivé et qui "indique" la façon dont le CObject va être dessiné

    C'est là qu'elle devrait être effectivement, comme membre public.
    c'est justement ce que je ne veut pas, je cherche à faire que SetParent ne soit utilisable que par CObject et ses héritiers

    si je laisse SetParent en public dans CObject je n'ai pas de problème mais je voudrais justement que SetParent ne soit pas public tout en donnant la possibilité de pouvoir indiquer à un CObject (qui peut-etre un CWnd ou un CButton) qui est son parent

    j'ai un peu de mal à m'expliquer, veuillez m'en excuser
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et en mettant SetParent en protected ?

  5. #5
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    Citation Envoyé par Loulou24
    Et en mettant SetParent en protected ?
    j'obtient l'erreur suivante :
    C2248: 'CObject::SetParent'*: impossible d'accéder à protected membre déclaré(e) dans la classe 'CObject'

    et c'est à cause de l'appel : pObjet->SetParent(this) par un héritier

    la seule solution que j'ai trouvé jusqu'à présent mais qui ne me convient pas (je sais je suis exigeant) c'est de mettre dans la section protected (SetParent de CObject est en protected aussi)
    friend class CObject;
    dans chaque héritier et de remplacer
    pObjet->SetParent(this);
    par
    m_pParent = this;

    si je ne trouve pas d'autre alternative je finirai par m'y plier
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Ce que tu cherches à faire n'est pas prévu dans le language C++. La restriction d'accès au méthodes d'une classe ne se décline qu'en 3 niveaux : public, protected et private, avec des exceptions possibles (classes ou fonctions amies).
    D'autres langages implantes ce que tu décris (Eiffel par exemple).
    Dans ce cas présent, je laisserais la méthode publique. Un objet extérieur doit pouvoir fixer le père d'un CObject. Ce type de construction est utilisé dans la bibliotèque Qt (structure arborescente entre tous les composants graphiques) et les méthodes de rattachement sont publique.

  7. #7
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut Finalement
    Merci à tous pour vos réponses, finalement je vais suivre mon idée première et donc le conseil de VoidSeer et laisser la méthode en public

    je pense que c'est la meilleure solution surtout si après je veux pouvoir modifier le parent d'un objet sans trop de contraintes
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    la seule solution que j'ai trouvé jusqu'à présent mais qui ne me convient pas (je sais je suis exigeant) c'est de mettre dans la section protected (SetParent de CObject est en protected aussi)
    friend class CObject;
    dans chaque héritier et de remplacer
    pObjet->SetParent(this);
    par
    m_pParent = this;

    si je ne trouve pas d'autre alternative je finirai par m'y plier
    tu peux aussi déclarer SetParent en static avec un paramètre supplémentaire (si tu trpouvess cela plus élégant)

    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
     
    class CUIObject 
    { 
    public: 
          CUIObject(void):m_pParent(NULL) {} 
          virtual ~CUIObject(void) {} 
     
       protected: 
          static void SetParent(CUIObject* pObject, CUIObject* pParent) {
              pObject->m_pParent = pParent; 
          } 
     
       protected: 
          CObject*   m_pParent; 
    };
    En tout cas je trouve plus élégant!

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Pour compléter mon dernier post j'ajouterai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CObjetComplexe::AddObjet(CUIObject* pObjet) 
    { 
       m_arObjects.Add(pObjet); 
       SetParent(pObject, this); 
    }

  10. #10
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    Merci pour cette proposition intéressante
    je me sens bête sur ce coup là de ne pas y avoir pensé
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/06/2008, 14h29
  2. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 10h37
  3. Problème d'exposant sur une méthode mathématique.
    Par ecobarito dans le forum Débuter
    Réponses: 14
    Dernier message: 29/08/2007, 20h16
  4. [POO] Héritage d'une méthode getInstance ?
    Par knocc dans le forum Langage
    Réponses: 4
    Dernier message: 13/02/2007, 19h47
  5. Réponses: 3
    Dernier message: 15/12/2006, 16h14

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