C++嵌套结构的朋友

Friend for nested structure in C++

本文关键字:朋友 结构 嵌套 C++      更新时间:2023-10-16

我知道布鲁斯·埃克尔(Bruce Eckel)的《C++思维》不是一本参考书,但我发现了一个奇怪的段落,我不明白它今天是否仍然适用:

使结构嵌套不会自动授予其访问权限 私人成员。为此,您必须遵循特定的 形式:首先,声明(不定义)嵌套结构,然后 将其声明为好友,最后定义结构。这 结构定义必须与 friend 声明分开, 否则,编译器会将其视为非成员。

我实际上尝试了这个,没有将嵌套结构声明为朋友,它奏效了:

struct myStruct{
private:
    int bar;
public:
    struct nestedStruct{
        void foo(myStruct *);
    }a;
};
void myStruct::nestedStruct::foo(myStruct * p){
    p->bar = 20;
}

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

这句话是错误的。嵌套的内部类类型可以访问封闭类类型的所有成员(包括private)。

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

11.7 嵌套类 [class.access.nest]

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