4 votes

Ami pour structure imbriquée en C++

Je sais que Thinking in C++ de Bruce Eckel n'est pas un livre de référence mais j'ai trouvé un paragraphe étrange et je ne comprends pas s'il est toujours applicable aujourd'hui :

Rendre une structure imbriquée ne lui donne pas automatiquement accès aux membres privés. Pour réaliser cela, vous devez suivre une forme particulière : d'abord, déclarez (sans définir) la structure imbriquée, puis déclarez-la en tant qu'ami, et enfin définissez la structure. La définition de la structure doit être séparée de la déclaration de l'ami, sinon elle serait vue par le compilateur comme un non-membre.

En fait, j'ai essayé cela sans déclarer la structure imbriquée comme amie et cela a fonctionné :

struct myStruct{
private:
    int bar;
public:
    struct nestedStruct{
        void foo(myStruct *);
    }a;
};

void myStruct::nestedStruct::foo(myStruct * p){
    p->bar = 20;
}

Est-il encore nécessaire de déclarer une structure imbriquée en ami afin de modifier les membres privés de la classe de base ?

9voto

Luchian Grigore Points 136646

Cette citation est fausse. Un type de classe interne imbriquée a accès à tous les membres (y compris private ) du type de classe englobante.

Ce n'était pas le cas en C++98, et votre édition fait probablement référence à cette version de la norme. En C++03 et C++11, la citation ne s'applique pas.

11.7 Classes imbriquées [class.access.nest]

1 Une classe imbriquée est un membre et, en tant que tel, a les mêmes droits d'accès que tout autre membre. Les membres d'une classe englobante n'ont pas un accès spécial aux membres d'une classe imbriquée; les règles d'accès habituelles (Clause 11) doivent être respectées.

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