Maison >développement back-end >C++ >Comment les classes internes en C peuvent-elles accéder aux membres privés de leur classe englobante ?
Classes internes accédant aux variables privées en C
En C, les classes internes ont la capacité unique d'accéder aux membres privés de la classe englobante. Prenons l'exemple suivant :
class Outer { class Inner { public: Inner() {} void func(); }; private: static const char* const MYCONST; int var; };
Dans cet exemple, la classe Inner est définie au sein de la classe Outer. Selon les règles de portée traditionnelles, la variable membre var de Outer ne doit pas être accessible à Inner. Cependant, en C , les classes internes sont intrinsèquement amies de leur classe englobante.
Par conséquent, les objets de type Outer::Inner peuvent accéder aux variables membres privées de Outer. Cependant, il est important de noter que cet accès n'est accordé que dans le cadre de la classe interne.
Pour illustrer davantage ce concept, modifions la méthode func() de la classe Inner comme suit :
void Outer::Inner::func() { var = 1; }
Maintenant, si nous essayons de compiler ce code, nous rencontrerons un message d'erreur indiquant que 'class Outer::Inner' n'a aucun membre nommé 'var'. En effet, même si les classes internes ont accès aux membres privés, elles n'héritent pas d'une relation de membre avec la classe englobante.
Pour établir une relation de membre appropriée au sein de la classe interne, nous devons créer manuellement une référence à la classe interne. classe englobante, comme le montre l'exemple suivant :
class Outer { class Inner { public: Inner(Outer& x): parent(x) {} void func() { std::cout << parent.var << std::endl; } private: Outer& parent; }; public: Outer() : i(*this), var(4) {} void func() { i.func(); } private: Inner i; int var; }; int main() { Outer o; o.func(); }
Dans cet exemple, le constructeur de classe Inner prend une référence à la classe Outer comme argument. Cela permet aux objets de type Outer::Inner d'accéder aux membres privés d'Outer via la référence parent.
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!