Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在内部类中访问外部类的私有成员数据_C++_Nested Class - Fatal编程技术网

C++ 在内部类中访问外部类的私有成员数据

C++ 在内部类中访问外部类的私有成员数据,c++,nested-class,C++,Nested Class,有以下代码: #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; }

有以下代码:

#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;
} 
#包括
类外部{
int a;//类外部的私有数据成员
公众:
外层():a(55){}
班级内部{
公众:
虚无乐趣(外ob){

std::cout根据文档xlc/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条)


在以前的语言标准中,是否不允许此访问,或者至少不清楚是否应允许此访问,具体取决于您的解释。

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

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

但这是一个缺陷:

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

C++11标准11.7嵌套类:

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


该示例与您正在讨论的示例类似,它清楚地显示了它的有效行为。

不,该文章还说内部类没有访问封闭类的权限。但您是对的,它完全有效。@hvd:我认为您是对的,经过编辑。我不得不重新阅读几次,因为它看起来有点混乱。事实上,它是pe非常有效,但(大概是在IBM编写文档和编译器时)最初无效:@hvd:interest使其有效,我认为访问总是被允许的,但“修复”看起来不仅仅是一个澄清。最初,我认为嵌套类可以访问封闭类的私有成员,只是因为它们是该类的成员,并且所需的访问不需要e'special.@CharlesBailey:最初在c++03中,封闭类和嵌套类都不应该访问彼此的私有类,但是允许访问封闭类的嵌套类修复了c++11中的缺陷,我对这样一个事实感到困惑,即即使在
gcc-4.3.4
中,它也可以干净地编译,我不知道它们是否修复了d基于缺陷报告或c++03标准修订版之后的修复,但据我所知,c++03的下一个修订版是c++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]