2010-04-22 79 views
16

HI,关于产品C++内部类

在C++中的内部类,

class A { 
    public: 
     void f1(); 
    private: 
     void f2(); 
    class B { 
     private void f3(); 
    }; 

} 

是否一个内部类(B)具有一个指向它的父类(A)? (就像它在Java中那样)。 而且B可以调用它的父类public/private方法(就像它在Java中一样)。

谢谢。

回答

28

否 - 在C++中,嵌套类仅影响名称和可见性,而不影响类本身的语义。就生成的代码而言,嵌套类与嵌套类没有区别。

所有改变的是可见性和名称(例如,如果它位于外部类的private:部分中,它对外界不可见,并且如果它位于public:部分中,则它是可见的,但是(当然)你可以使用outer_class::inner_class,它仍然是一个完全独立的类 - 例如,你可以创建一个内部类的实例,而不需要创建任何外部类的实例。

编辑:对不起,我错过了部分你的问题在C++ 0x中,内部类可以访问外部类的私有部分 - 实质上,就好像外部类已经将内部类声明为它的朋友一样,所以私有名称是可见的,但是你仍然需要传递一些东西就像引用外部类的对象,然后它可以调用外部类的任何非静态成员函数。

虽然这不应该是这种情况,但我相信大多数编译器已经实现了这个特定的部分。

+4

看来,这是C++ 0x中不断变化的访问。 C++ 03说:“嵌套类的成员对封闭类的成员没有特殊访问权。” C++ 0x FCD表示:“嵌套类是一个成员,因此与任何其他成员具有相同的访问权限。” (均为§11.8/ 1)。 (该更改由CWG缺陷45和494引入:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45和http://www.open-std.org/ jtc1/sc22/wg21/docs/cwg_defects.html#494) – 2010-04-22 01:12:07

+0

不错 - 这消除了编写'friend class {'的冲动,它受到一些编译器的支持,但显然不会使嵌套类不是成员! – Potatoswatter 2010-04-22 02:39:43

+1

@Potato:有趣的是,即使在严格的C++ 03模式下的Comeau也不遵循C++ 03语言。这使我相信(a)可能出于某种原因遵循C++ 03语言(虽然我还没有弄清楚为什么,除了上面链接的DR所提及的原因外)和( b)很可能没​​有人真正遵循C++ 03语言:-)。 – 2010-04-22 16:20:46

7

不,B类没有指向A类的指针,除非您明确地添加它。

0

它有一个指向父:第
是否有机会获得父母的私有成员:排序的

我觉得如果访问没有很好地界定标准我可以错误。
但是你可以用g ++

#include <iostream> 

class X 
{ 
    class Y 
    { 
     public: 
      Y(X* p) 
       :parent(p) 
      {} 
      void TryY() 
      { 
       // Access a private member of X 
       ++(parent->value); 
      } 

     private: 
      X* parent; 
    }; 

    public: 
     X() 
      :y(this) 
     { 
      value = 4; 
     } 

     void TryY() 
     { 
      y.TryY(); 
      std::cout << value << std::endl; 
     } 
    private: 
     Y y; 
     int value; 

}; 

int main() 
{ 
    X x; 
    x.TryY(); 
} 
+0

根据*§11.8/ 1 *,C++ 03应该是不正确的行为。 – 2010-04-22 01:34:22