【问题标题】:Access to private member data of outer class in inner class在内部类中访问外部类的私有成员数据
【发布时间】:2012-01-15 13:18:55
【问题描述】:

有这个代码:

#include <iostream>

class Outer{
    int a; // private data member of class Outer
public:
    Outer(): a(55){}
    class Inner{
    public:
        void fun(Outer ob){
            std::cout << ob.a << std::endl;
        }
    };
};

int main() {

    Outer::Inner object;
    object.fun(Outer()); // prints 55
    //std::cout << (Outer().a) << std::endl; error: 'int Outer::a' is private

    return 0;
} 

为什么 Inner 类可以访问 Outer 类的私有成员数据“a”?在这篇文章XL C/C++ V8.0 for Linux 之后,它不应该编译,但是它可以在 g++ 4.4.0 上编译。

【问题讨论】:

    标签: c++ nested-class


    【解决方案1】:

    C++03 标准 $11.8/1:[class.access.nest]

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

    但这是一个缺陷:

    45. Access to nested classes

    在 C++11 中,这已得到纠正:在 C++11 中,嵌套类确实可以访问封闭类的私有成员(尽管封闭类仍然无法访问嵌套类的私有成员) .

    C++11 Standard 11.7 嵌套类:

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

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

    该示例与您所讨论的示例相似,并且清楚地显示了其有效行为。

    【讨论】:

      【解决方案2】:

      根据该文档,XL C/C++ V8.0 不支持 C++11,请参阅“语言标准合规性”部分。

      编译器支持以下 C 和 C++ 编程语言规范:

      • ISO/IEC 9899:1999 (C99)
      • ISO/IEC 9899:1990(简称 C89)
      • ISO/IEC 14882:2003(称为标准 C++)
      • ISO/IEC 14882:1998,该语言的第一个官方规范 (简称C++98)

      现行标准规定 (ISO/IEC 14882:2011 11.7):

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

      在以前的语言标准中,这种访问是不允许的,还是至少不清楚是否应该允许,这取决于您的解释。

      【讨论】:

      • 不,那篇文章还说内部类无权访问封闭类。但你是对的,它是完全有效的。
      • @hvd:我认为你是对的,已编辑。我不得不重新阅读它几次,因为它似乎有点混乱。
      • 事实上,它是完全有效的,但是(大概在 IBM 编写其文档和编译器时)最初是无效的:它是由 open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45 使其有效的
      • @hvd:有趣的是,我虽然一直允许访问,但“修复”看起来不仅仅是一个澄清。最初,我认为嵌套类可以访问封闭类的私有成员只是因为它们是该类的成员,并且所需的访问权限不需要是“特殊的”。
      • @CharlesBailey:最初在 c++03 中,封闭类和嵌套类都不应该访问彼此的私有,但是允许嵌套类访问封闭类是对C++11 中的缺陷,我对即使在 gcc-4.3.4 中也能干净地编译这一事实感到困惑,我想知道他们是根据缺陷报告修复它还是在 c++03 标准修订版之后修复它,但正如我了解 c++03 的下一个版本是 c++11。
      猜你喜欢
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 2020-08-02
      • 2011-08-11
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多