C++巢狀類的使用方法
阿新 • • 發佈:2018-12-31
在一個類的內部定義另一個類,我們稱之為巢狀類(nested class),或者巢狀型別。之所以引入這樣一個巢狀類,往往是因為外圍類需要使用巢狀類物件作為底層實現,並且該巢狀類只用於外圍類的實現,且同時可以對使用者隱藏該底層實現。
雖然巢狀類在外圍類內部定義,但它是一個獨立的類,基本上與外圍類不相關。它的成員不屬於外圍類,同樣,外圍類的成員也不屬於該巢狀類。巢狀類的出現只是告訴外圍類有一個這樣的型別成員供外圍類使用。並且,外圍類對巢狀類成員的訪問沒有任何特權,巢狀類對外圍類成員的訪問也同樣如此,它們都遵循普通類所具有的標號訪問控制。
若不在巢狀類內部定義其成員,則其定義只能寫到與外圍類相同的作用域中,且要用外圍類進行限定,不能把定義寫在外圍類中。例如,巢狀類的靜態成員就是這樣的一個例子。
前面說過,之所以使用巢狀類的另一個原因是達到底層實現隱藏的目的。為了實現這種目的,我們需要在另一個頭檔案中定義該巢狀類,而只在外圍類中前向宣告這個巢狀類即可。當然,在外圍類外面定義這個巢狀類時,應該使用外圍類進行限定。使用時,只需要在外圍類的實現檔案中包含這個標頭檔案即可。
另外,巢狀類可以直接引用外圍類的靜態成員、型別名和列舉成員,即使這些是private的。
例項如下:
- #ifndef NESTCLASS_H_
- #define NESTCLASS_H_
- class A
- {
- public:
- A();
- ~A();
- void operate();
- private:
- class B;
- B* m_b;
- };
- #endif
- #include "nestclass.h"
- #include <iostream>
- usingnamespace std;
- class A::B
- {
- public:
- B(){}
- ~B(){}
- void operate()
- {
- cout<<"B operate!"<<endl;
- }
- };
- A::A()
- {
- }
- A::~A()
- {
- }
- void A::operate()
- {
- m_b = new B;
- cout<<"A operate!"<<endl;
- m_b->operate();
- }
- #include "nestclass.h"
- void main()
- {
- A a;
- a.operate();
- }