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 ?