【问题标题】:Memberspaces may access private members of parent class成员空间可以访问父类的私有成员
【发布时间】:2013-07-15 23:36:59
【问题描述】:

我一直在阅读this article,并且在玩了一段时间的成员空间成语时,我注意到这个 sn-p 中的一些东西让我感到惊讶(编译没有问题:http://ideone.com/hRiV5B):

class HugeClass
{
    public:
        struct memberspace
        {
            int f() const { return parent.f; }

            private:
                friend HugeClass;
                explicit memberspace(HugeClass & parent)
                : parent(parent) {}
                HugeClass & parent;
        } memberspace;

        HugeClass() : memberspace(*this), f(42) {}

    private:
        int f;
};

我预计会出现编译器错误,即不允许访问 HugeClass::f,因为 f 在该上下文中是私有的。

HugeClassfriendmemberspace,所以HugeClass 可以调用memberspace 的私有构造函数,但是为什么它在没有明确声明memberspace 的情况下反其道而行之? HugeClass?

【问题讨论】:

  • 成员空间被认为是 HugeClass 的一部分,因此具有完全访问权限。

标签: c++ idioms


【解决方案1】:

按 C++11 中的语言规则。

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

class E {
   int x;
   class B { };
   class I {
     B b; // OK: E::I can access E::B
     void f(E* p, int i) 
     {
        p->x = i; // OK: E::I can access E::x
     }
   };
};

在 C++03 中是

嵌套类的成员对封闭类的成员没有特殊的访问权,也对类或 赋予封闭类友谊的功能;通常的访问规则(第 11 条)应为 服从。

因此,来自 C++11 的示例不应该与 c++03 编译器一起使用。

【讨论】:

  • 请注意,这只是自 2011 年以来的正式情况。旧标准则相反(“嵌套类的成员对封闭类的成员没有特殊的访问权限”),尽管一些流行的编译器有多年来一直遵守新规则。
  • @MikeSeymour 谢谢。在发布答案之前也有理由阅读 C++03 标准
  • 这很有趣。在寻找这方面的更多信息时,我发现了语言缺陷报告:open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45 从该文档中,实际上我认为它在 C++03(不仅是 C++11)中有效,因为最初的行为被认为是一种语言缺陷
【解决方案2】:

memberspaceHugeClass 的一部分,与其他班级成员具有相同的访问权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2021-06-21
    • 2020-01-19
    • 1970-01-01
    • 2023-03-22
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多