【问题标题】:'enclosing' scopes for friendship classes友谊课程的“封闭”范围
【发布时间】:2009-12-18 05:20:59
【问题描述】:

Bjarne Stroustrup 写道:

“朋友类必须事先在封闭范围内声明或在非类范围内定义,立即封闭正在声明它为朋友的类”

语句的第一部分不是多余的吗,因为“立即封闭类的非类作用域”包括“先前在封闭作用域中声明的”? IE:这两个范围有什么区别?

【问题讨论】:

  • “必须事先声明一个朋友类”——听起来很奇怪。在没有事先声明 B 的情况下说 struct A { friend class B; }; 是完全有效的。
  • AFAIK 你可以将 any 类声明为朋友:struct A {friend classDNE;}。我认为 Bjarne 在这里谈论的是朋友声明语句中的类如何“绑定”到定义(如果存在的话)。因此,在您的情况下,如果 B 在全局空间中定义,而 A 在命名空间中定义,则 A 声明中的友元类“B”不会“绑定”到全局类 B - 全局类 B 将无法访问A 的私有成员。

标签: c++ scope


【解决方案1】:

我认为在第一部分中,朋友类是在一个声明它为朋友的类(嵌套)中声明的。而在第二部分中,朋友类是在外部声明的,就在声明它为朋友的类之前。

【讨论】:

    【解决方案2】:

    也许第二部分说“立即封闭”而第一部分没有?所以我从中收集到,如果类是在非类范围(即命名空间或全局)中声明的,它只能是直接封闭的范围(一个向上)。如果它是在封闭的 class 范围内声明的(想想嵌套类),它可以在你想要的任意多的范围内。

    意思如下是有效的:

    class Grandpa
    {
        class Mother
        {
            class Junior
            {
                friend class Grandpa;
            };
    
        };
    };
    

    仅仅因为GrandpaJunior 之上的几个“类范围”。

    【讨论】:

    • 我认为您可能会有所了解,但很难确定该语言(本质上)不精确。让我失望的是“必须事先在封闭范围内声明一个朋友类”。如果您在全局范围(包含 all 范围)中声明(AFAIK 与定义相同)一个友元类(包含 all 范围),则它不起作用。
    • 唉,英语是一种比 c++ 更加模糊的语言 :-)
    【解决方案3】:

    朋友不要让朋友使用朋友。

    【讨论】:

    • 相反,朋友可以访问您的私人会员,这是您通常不想要的。
    • 这很有趣,因为它是真的。
    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2013-11-01
    • 2011-11-19
    • 2015-07-01
    • 2023-03-14
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多