4

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

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

我实际上在没有将嵌套结构声明为朋友的情况下尝试了这个并且它有效:

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

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

为了修改基类的私有成员,还需要声明嵌套结构友元吗?

4

1 回答 1

9

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

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

11.7 嵌套类 [class.access.nest]

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

于 2012-10-12T23:31:30.913 回答