C++中嵌套结构的朋友

Mih*_*csu 4 c++ struct nested

我知道Bruce Eckel的C++思考不是参考书,但我发现了一个奇怪的段落,我不明白它是否仍适用于今天:

使嵌套结构不会自动授予其访问私有成员的权限.要实现这一点,您必须遵循一个特定的形式:首先,声明(不定义)嵌套结构,然后将其声明为朋友,最后定义结构.结构定义必须与友元声明分开,否则编译器会将其视为非成员.

我实际上尝试过这一点,而没有将嵌套结构声明为朋友而且它有效:

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

void myStruct::nestedStruct::foo(myStruct * p){
    p->bar = 20;
}
Run Code Online (Sandbox Code Playgroud)

是否仍需要声明嵌套结构的朋友才能修改基类的私有成员?

Luc*_*ore 6

那句话错了.嵌套的内部类类型可以访问private封闭类类型的所有成员(包括).

在C++ 98中并非如此,您的版本可能是指该版本的标准.在C++ 03和C++ 11中,引用不适用.

11.7嵌套类[class.access.nest]

1嵌套类是成员,因此具有与任何其他成员相同的访问权限.封闭类的成员对嵌套类的成员没有特殊访问权限; 应遵守通常的访问规则(第11条).