1. 程式人生 > >C++巢狀類的使用方法

C++巢狀類的使用方法

     在一個類的內部定義另一個類,我們稱之為巢狀類(nested class),或者巢狀型別。之所以引入這樣一個巢狀類,往往是因為外圍類需要使用巢狀類物件作為底層實現,並且該巢狀類只用於外圍類的實現,且同時可以對使用者隱藏該底層實現。    雖然巢狀類在外圍類內部定義,但它是一個獨立的類,基本上與外圍類不相關。它的成員不屬於外圍類,同樣,外圍類的成員也不屬於該巢狀類。巢狀類的出現只是告訴外圍類有一個這樣的型別成員供外圍類使用。並且,外圍類對巢狀類成員的訪問沒有任何特權,巢狀類對外圍類成員的訪問也同樣如此,它們都遵循普通類所具有的標號訪問控制。    若不在巢狀類內部定義其成員,則其定義只能寫到與外圍類相同的作用域中,且要用外圍類進行限定,不能把定義寫在外圍類中。例如,巢狀類的靜態成員就是這樣的一個例子。    前面說過,之所以使用巢狀類的另一個原因是達到底層實現隱藏的目的。為了實現這種目的,我們需要在另一個頭檔案中定義該巢狀類,而只在外圍類中前向宣告這個巢狀類即可。當然,在外圍類外面定義這個巢狀類時,應該使用外圍類進行限定。使用時,只需要在外圍類的實現檔案中包含這個標頭檔案即可。    另外,巢狀類可以直接引用外圍類的靜態成員、型別名和列舉成員,即使這些是private的。  例項如下:
  1. #ifndef NESTCLASS_H_
  2. #define NESTCLASS_H_
  3. class A
  4. {
  5. public:
  6.     A();
  7.     ~A();
  8. void operate();
  9. private:
  10. class B;
  11.     B* m_b;
  12. };
  13. #endif
  14. #include "nestclass.h"
  15. #include <iostream>
  16. usingnamespace std;
  17. class A::B
  18. {
  19. public:
  20.     B(){}
  21.     ~B(){}
  22. void operate()
  23.     {
  24.         cout<<"B operate!"<<endl;
  25.     }
  26. };
  27. A::A()
  28. {
  29. }
  30. A::~A()
  31. {
  32. }
  33. void A::operate()
  34. {
  35.     m_b = new B;
  36.     cout<<"A operate!"<<endl;
  37.     m_b->operate();
  38. }
  39. #include "nestclass.h"
  40. void main()
  41. {
  42.     A a;
  43.     a.operate();
  44. }
        在巢狀類的定義被看到之前我們只能宣告巢狀類的指標和引用,如上面在A中定義為B m_b而不是B* m_b將會引發一個編譯錯誤。關於C++巢狀類的詳細用法請參考《C++ Primer 第三版》P551