131 votes

Les classes internes peuvent-elles accéder à des variables privées?

    class Outer {

      class Inner {
          public:
              Inner() {}
              void func() ;
      };

  private:
      static const char* const MYCONST;
      int var;

  };

  void Outer::Inner::func() {
      var = 1;
  } 

  const char* const Outer::MYCONST = "myconst";
 

Cette erreur se produit lorsque je compile avec la classe Outer :: Inner 'n'a pas de membre nommé `var'

138voto

Loki Astari Points 116129

Une classe interne est un ami de la classe dans laquelle elle est définie.
Donc oui, un objet de type Outer :: Inner peut accéder à la variable membre var d'un objet de type Outer.

Contrairement à Java, il n’existe aucune corrélation entre un objet de type Outer :: Inner et un objet de la classe parente. Vous devez créer la relation parent-enfant manuellement.

 #include <string>
#include <iostream>

class Outer
{
    class Inner
    {
        public:
            Inner(Outer& x): parent(x) {}
            void func()
            {
                std::string a = "myconst1";
                std::cout << parent.var << std::endl;

                if (a == MYCONST)
                {   std::cout << "string same" << std::endl;
                }
                else
                {   std::cout << "string not same" << std::endl;
                }
            }
        private:
            Outer&  parent;
    };

    public:
        Outer()
            :i(*this)
            ,var(4)
        {}
        Outer(Outer& other)
            :i(other)
            ,var(22)
        {}
        void func()
        {
            i.func();
        }
    private:
        static const char* const MYCONST;
        Inner i;
        int var;
};

const char* const Outer::MYCONST = "myconst";

int main()
{

    Outer           o1;
    Outer           o2(o1);
    o1.func();
    o2.func();
}
 

35voto

MSN Points 30386

Une classe interne a accès à tous les membres de la classe externe, mais ne comporte pas de référence implicite à une instance de classe parent (contrairement à certaines bizarreries avec Java). Ainsi, si vous transmettez une référence à la classe externe à la classe interne, celle-ci peut faire référence à tout élément de l'instance de classe externe.

6voto

Mark Ransom Points 132545

Tout ce qui fait partie d'Outer devrait avoir accès à tous les membres d'Outer, publics ou privés.

Edit: votre compilateur est correct, var n'est pas membre d'Inner. Mais si vous avez une référence ou un pointeur sur une instance de Outer, il pourrait y accéder.

2voto

xiaochuanQ Points 54

var n'est pas un membre de l'intérieur de la classe.

Pour accéder var, un pointeur ou une référence à l'extérieur de la classe de l'instance devrait être utilisé. par exemple, pOuter->var fonctionne si l'intérieur de la classe est un ami de l'extérieur, ou, var est public, si l'on suit le standard C++ strictement.

Certains compilateurs traiter les classes internes comme l'ami de l'extérieur, mais certains ne peuvent pas. Consultez ce document pour IBM compilateur:

"Une classe imbriquée est déclaré dans le champ d'application d'une autre classe. Le nom d'une classe imbriquée est local à sa classe englobante. À moins d'utiliser des pointeurs, références, ou des noms d'objets, de déclarations dans une classe imbriquée pouvez utiliser uniquement visible des constructions, y compris les noms, les membres statiques, et des enquêteurs de la classe englobante et des variables globales.

Les fonctions membres d'une classe imbriquée suivez les règles d'accès et n'ont pas d'accès spécial de privilèges pour les membres de leur joignant les classes. Les fonctions membres de la classe englobante n'ont accès aux membres d'une classe imbriquée."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X