81

如果我在 C++ 中定义一个内部类,它会自动成为包含它的类的朋友吗?例如,这是否合法:

class Outer {
public:
    class Inner {
    public:
        void mutateOuter(Outer& o);
    };

private:
    int value;
};

void Outer::Inner::mutateOuter(Outer& o) {
    o.value ++; // Legal?  Or not?
}

我之所以问,是因为在我尝试过的某些编译器(VS2003)上,这段代码不起作用,但我至少听说过它确实适用于某些编译器。我在 C++ 规范中找不到关于此的相关部分,如果有人能引用一些具体的东西来说明它是否合法,那就太好了。

4

5 回答 5

81

在我自己在这里问了或多或少相同的问题之后,我想分享(显然)C++ 11 的更新答案:

引自https://stackoverflow.com/a/14759027/1984137

标准 11.7.1 美元

“嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则”

并且通常的访问规则指定:

“一个类的成员还可以访问该类可以访问的所有名称......”

标准中已经给出了具体的例子:

class E {
    int x;
    class B { };

    class I {
        B b; // OK: E::I can access E::B
        int y;
        void f(E* p, int i) {
            p->x = i; // OK: E::I can access E::x
        }
    };
}
于 2013-02-07T19:41:22.750 回答
49

直到 C++11(即 C++98 和 C++03)

在 C++98 和 C++03 中,嵌套类默认不能访问privateprotected封闭类的成员。

C++ 标准 (2003) 在 $11.8/1 [class.access.nest] 中说,

嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已授予封闭类友谊的类或函数的特殊访问权限;应遵守通常的访问规则(第 11 条)。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第 11 条)。

标准本身的示例:

class E 
{
    int x;
    class B { };
    class I 
    {
        B b; // error: E::B is private
        int y;
        void f(E* p, int i)
        {
           p->x = i; // error: E::x is private
        }
   };
   int g(I* p)
   {
       return p->y; // error: I::y is private
   }
};

自 C++11 起

自 C++11 起,上述限制已被删除。现在嵌套类可以访问封闭类的privateprotected成员:

class E 
{
    int x;
    class B { };
    class I 
    {
        B b; // ok: even though E::B is private
        int y;
        void f(E* p, int i)
        {
           p->x = i; // ok: even though E::x is private
        }
   };
   int g(I* p)
   {
       return p->y; // ok: even though I::y is private
   }
};

希望有帮助。

于 2011-02-16T07:40:21.620 回答
16

由于提问者似乎已经接受了其中一个答案,这只是一个补充。
该标准似乎改变了关于可访问性的规范。

C++98 中的 §11.8/1 规定:

嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已授予封闭类友谊的类或函数的特殊访问权限;应遵守通常的访问规则。

N1804(TR1 之后)中的第 11.8/1 条规定:

嵌套类是成员,因此具有与任何其他成员相同的访问权限。

我认为当前的 C++ 编译器遵循更新的规范。

于 2011-02-16T09:23:05.527 回答
4

这个答案与(过时的)C++03 规范有关。在这个问题上接受的答案是最新的。

好吧,我现在问这个问题感觉很傻,因为我刚刚找到了规范的相关部分,涵盖了这个:§11.8/1:

嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已授予封闭类友谊的类或函数的特殊访问权限;应遵守通常的访问规则(第 11 条)。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第 11 条)

(我的重点)

所以看起来没有,内部类没有特殊的访问权限。

于 2011-02-16T07:46:29.217 回答
3

我不知道确切的位置,但我确实记得阅读了规范并发现一个类中的任何私有数据都对所有其他类隐藏,包括嵌套类。

基本上,嵌套类定义了一定的范围,而不是访问权限。

于 2011-02-16T07:40:35.300 回答