2010-04-22 54 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