Les classes internes peuvent-elles accéder aux variables privées ?
Dans cet exemple de code, une classe interne, Inner, est définie au sein d'une classe externe, Outer . Lorsqu'une instance de Inner est créée, elle est censée avoir accès à la variable membre privée var de la classe Outer. Cependant, une fois compilé, une erreur se produit, indiquant qu'Inner n'a aucun membre nommé var.
Classes internes et accès aux membres
Une classe interne en C est considérée comme un ami de sa classe extérieure. En tant qu'ami, une classe interne a accès à tous les membres de la classe externe, y compris les membres privés. Par conséquent, les instances de Inner devraient pouvoir accéder à la variable privée var de Outer.
Le problème et la solution
L'erreur provient de l'absence de connexion entre instances de Inner et instances de Outer. En Java, il existe une relation parent-enfant implicite entre les classes internes et leurs classes englobantes. Cependant, en C , cette relation doit être explicitement définie.
Pour résoudre le problème, une référence à la classe externe doit être transmise au constructeur de la classe interne. Cela fournit à la classe interne le contexte nécessaire pour accéder aux membres de la classe externe.
Voici un exemple qui montre comment établir la connexion parent-enfant et permettre à Inner d'accéder à la variable privée var de Outer :
#include <string> #include <iostream> class Outer { public: class Inner { public: Inner(Outer& x): parent(x) {} // Pass a reference to the outer class void func() { std::string a = "myconst1"; std::cout << parent.var << std::endl; if (a == Outer::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(); return 0; }
Ce code révisé permet à Inner d'accéder à var car le constructeur d'Inner établit une relation parent-enfant entre Inner et l'instance Outer qui l'a créé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!