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 encapsulation C++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Par d�faut Probl�me encapsulation C++
    Bonjour!

    J'ai un petit probl�me. J'ai une classe qui a �t� d�finie comme membre d'une autre classe
    voil� comment je proc�de pour coder les differentes methodes de la classe 2

    classe1::classe2::method()

    il se trouve que la classe 2 est un membre protected de la classe1

    A l'interieur d'une methode de la classe 2, j'aimerais acceder � certains membres protected de la classe 1 et le compilateur me dit que c'est pas possible

    en gros j'ai un membre classe protected qui veut dans l'une de ses methodes avoir acc�s � un membre protected de la classe dans laquelle elle est definie..

    Est ce normal que je puisse pas y avoir acc�s?

  2. #2
    Membre chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par d�faut
    Oui c'est normal, les classes imbriqu�es en C++ n'ont pas de privil�ge d'acc�s sur les classes encapsulantes.

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    La classe "classe2" n'est pas d�finie comme membre de la classe "classe1" mais comme... classe imbriqu�e... fusse-elle une classe "anonyme"

    Le fait que, par la suite, tu aie d�clar� un membre du type de la classe imbriqu�e ne changera rien

    Il faut savoir que, d�s le moment o� tu utilise le mot cl� class pour d�finir une nouvelle structure, tu encapsule irr�m�diablement tout ce qu'elle peut contenir.

    C'est exactement ce qui se passe avec les espaces de nommages:
    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
     
    namespace MonNameSpace
    {
        void foo(MaClasse&);
        class MaClasse
        {
             public:
                /*foo a acces a tout ce qui est public ... */
             protected :
                /*... mais à rien de ce qui est protected ... */
             private:
                /* ... ou private ...*/
        };
     
    };
    Si tu veux que, dans ton exemple, classe1 puisse acc�der directement aux membres protected et/ou private de classe2, il faudra signaler l'amiti� de classe1 pour classe2 , ce qui ne change d'ailleurs absolument pas de ce qui doit �tre fait avec deux classes bien distinctes...

    Le fait de d�clarer des classes imbriqu�es n'apporte, en r�alit�, qu'un seul avantage par rapport � celui de d�clarer des classes distinctes, et qui est celui que l'on retrouve dans l'utilisation des espaces de nommage: le nom du type cr�� devient "d�pendant" de l'espace de nommage/la classe dans le(la)quel(le) il est d�fini, et peut donc �tre r�utilis� ailleurs
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Par d�faut probl�me encapsulation
    dans ce cas dans une structure de classe imbriqu�es:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class classe1
    {
       protected:
       Methode_classe1() ;
     
       class classe2
       {
         protected:
         membre_classe2 ;
       }
    }
    Comment je dois proc�der pour pouvoir avoir acc�s � membre_classe2 en etant dans l'ecriture de la definition de Methode_classe1() ?
    Ou comment puis-je modifier la valeur de membre_classe2 en etant dans Methode_classe1()?

    Je vous remercie d'avance

  5. #5
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Il te faut 1) une instance de la classe int�rieure 2) un couple accesseur/mutateur pour ton attribut

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Par d�faut reponse a Alp
    d�sol� Alp mais franchement je suis un debutant j'ai rien compris � la 2)
    c'est quoi un couple accesseur/mutateur?

    merci

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    ou
    1. une instance de la classe sup�rieure
    2. d�clarer la classe sup�rieure comme amie de la classe imbriqu�e.


    Au final, tu as donc deux solutions:

    Celle propos�e par Alp () qui prend la forme de
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class Classe1
    {
         public:
        class classe2
        {
            public:
                Classe2();//constructeur
                ~Classe2();//destructeur
                /*const */ type /*&*/ GetMembre()/*const*/
                {
                    return membre_classe2;
                }
                void SetMembre(/*const*/ type /*&*/ newval)
                {
                     membre_classe2=newval;
                }
            protected:
                type membre_classe2 ;
        };
             Classe1();//constructeur
             ~Classe1();//destructeur
             /*const */ type /*&*/ GetMembreClass2()/*const*/
             {
                 return m1.GetMembre();
             }
             /* voir, pourquoi pas */
             void ModifyMembreClass2(/* const */ type /*&*/ newval)
             {
                  m1.SetMembre(newval);
             }
        protected:
        Methode_classe1()
        {
             type laval=m1.GetMembre();
             /* voir */
             m1.SetMembre( nouvelle_valeur_de_type_type);
        }
        private:
            Classe2 m1;
    };
    qui permet une utilisation sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*soit, on travaille uniquement avec Classe2 */
    Classe1::Classe2 obj;
    /* pour la modification du membre */
    obj.SetMembre(nouvelle_valeur);
    /*ou, pour l'acces au membre */
    type lemembre=obj.GetMembre();
    /* soit on travaille uniquement avec Classe1 */
    Classe1  autre_obj();
    /* pour récupérer la valeur */
    type lemembre_de_m1=autre_obj.GetMembreClass2();
    /* pour modifier la valeur */
    autre_obj.ModifyMembreClass2(nouvelle_valeur);
    Ou, si tu estimes peu coh�rent de permettre de modifier la valeur du membre autrement que par l'acc�s via Class1, tu peux envisager une relation d'amiti� sous la forme de
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    class Classe1
    {
        public:
        class classe2
        {
            public:
                Classe2();//constructeur
                ~Classe2();//destructeur
          /* ni mutateur, ni accesseur... Personne n'a acces à membre_class2*/
            private:
                type membre_classe2 ;
                /* sauf Class1, grâce à l'amitié */
                friend class Class1;
        };
            Classe1();//constructeur
            Classe1();//destructeur
             /*const */ type /*&*/ GetMembreClass2()/*const*/
             {
                 return m1.membre_classe2;
             }
             /* voir, pourquoi pas */
             void ModifyMembreClass2(/* const */ type /*&*/ newval)
             {
                  m1.membre_classe2=newval;
             }
        private:
            Classe2 m1;
     
    };
    Tu pourras alors cr�er sans probl�me un objet de type Classe2
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    Classe1::Classe2 objet; /* aucun problème: le constructeur de
                              * Classe2 est public
                              */
    mais le seul moyen de modifier la valeur de membre_classe2 passera par l'utilisation d'un objet de type Classe1
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* aucun acces à objet.membre_classe2, car il est privé ...
     * par contre tu peux y accéder par Classe1
     */
    Classe1 autre_objet;
    /* pour récupérer la valeur */
    type val=autre_objet.GetMembreClass2();
    /* ou pour en changer la valeur */
    autre_objet.ModifyMembreClass2(la_nouvelle_valeur);
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

Discussions similaires

  1. Probl�me de quotes dans du HTML encapsul�
    Par sub_zero dans le forum GWT et Vaadin
    R�ponses: 2
    Dernier message: 02/12/2012, 13h45
  2. Probl�me d'encapsulation des MFCs
    Par RT222 dans le forum MFC
    R�ponses: 3
    Dernier message: 27/09/2012, 11h35
  3. [CS4] Probl�me d'encapsulation de boutons
    Par Osef_ dans le forum ActionScript 1 & ActionScript 2
    R�ponses: 1
    Dernier message: 09/01/2011, 22h48
  4. 2 floats dans une div, probl�me d'encapsulation
    Par student_php dans le forum Mise en page CSS
    R�ponses: 3
    Dernier message: 15/11/2010, 16h30
  5. Probl�me encapsulation de scripts
    Par pitxu dans le forum Langage
    R�ponses: 1
    Dernier message: 14/09/2007, 20h32

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