Accessibilité aux classes nestedes C ++

Étant donné le code suivant sans considérer l’amitié entre deux classes:

class OutSideClass { ... public: int i_pub; protected: int i_pro; private: int i_pri; class InSideClass { ... public: int j_pub; protected: int j_pro; private: int j_pri; }; }; 

Question 1> Est-il vrai que OutSideClass peut UNIQUEMENT accéder aux membres publics de InSideClass

Question 2> Est-il vrai qu’InSideClass peut accéder à tous les membres de OutSideClass

S’il vous plaît corrigez-moi si ma compréhension n’est pas correcte.

Question 1> Est-il vrai que OutSideClass peut UNIQUEMENT accéder aux membres publics de InSideClass

Oui

Question 2> Est-il vrai qu’InSideClass peut accéder à tous les membres de OutSideClass

Non, en C ++ 03. Oui, en C ++ 11.


Le texte standard est très clair à ce sujet:

La norme C ++ (2003) dit dans $ 11.8 / 1 [class.access.nest],

Les membres d’une classe nestede n’ont aucun access spécial aux membres d’une classe englobante , ni aux classes ou fonctions ayant accordé l’amitié à une classe englobante; les règles d’access habituelles (clause 11) doivent être respectées. Les membres d’une classe englobante n’ont aucun access spécial aux membres d’une classe nestede; les règles d’access habituelles (clause 11) doivent être respectées.

Cependant, la citation standard a un défaut. Il indique que les classes nestedes n’ont pas access aux membres privés de la classe englobante. Mais en C ++ 11, cela a été corrigé: en C ++ 11, les classes nestedes ont access aux membres privés de la classe englobante (bien que la classe englobante n’ait toujours pas access aux membres privés des classes nestedes).

Voir ce rapport de défauts:

  • 45. Accès aux classes nestedes

Comme @Nawaz le souligne , en C ++ 03, les classes nestedes ne disposent pas de droits d’access spéciaux aux membres de la classe englobante. Cependant, il est facile de contourner cette limitation en déclarant la classe nestede en tant qu’ami.

 class OutSideClass { ... class InSideClass { ... }; friend class InSideClass; }; 

Tout ce que les classes nestedes font en C ++ est placé dans la classe interne dans l’espace de noms de la classe externe. Pour instancier une instance de InSideClass à partir d’une fonction membre de OutSideClass, il suffit de faire

 InSideClass *instance = new InSideClass(); 

Si InsideClass était public et que je souhaitais instancier InSideClass à partir d’une fonction qui n’est pas membre de OutSideClass, je taperais:

 OutSideClass::InSideClass *instance = new OutSideClass::InSideClass(); 

InSideClass et OutSideClass sont par ailleurs entièrement séparés, contrairement à d’autres langages tels que Java.

Il n’y a pas de privilèges d’access spéciaux pour la classe nestede à une classe englobante.