巢狀類別宣告
可以在某個類別的範圍內宣告另一個類別。 這種類別稱為「巢狀類別」。巢狀類別被視為在封入類別的範圍內,可在該範圍內使用。 若要在直接封入範圍以外參考巢狀類別,則必須使用完整名稱。
下列範例顯示如何宣告巢狀類別:
// nested_class_declarations.cpp
class BufferedIO
{
public:
enum IOError { None, Access, General };
// Declare nested class BufferedInput.
class BufferedInput
{
public:
int read();
int good()
{
return _inputerror == None;
}
private:
IOError _inputerror;
};
// Declare nested class BufferedOutput.
class BufferedOutput
{
// Member list
};
};
int main()
{
}
BufferedIO::BufferedInput 和 BufferedIO::BufferedOutput 會在 BufferedIO 內宣告。 這些類別名稱在類別 BufferedIO 的範圍外不會顯示。 不過,類型為 BufferedIO 的物件不包含任何類型為 BufferedInput 或 BufferedOutput 的物件。
巢狀類別只能直接使用封入類別中的名稱、類型名稱、靜態成員的名稱及列舉程式。 若要使用其他類別成員的名稱,您必須使用指標、參考或物件名稱。
在上述 BufferedIO 範例中,可以在巢狀類別、BufferedIO::BufferedInput 或 BufferedIO::BufferedOutput 中直接存取列舉 IOError,如函式 good 中所示。
注意事項 |
---|
巢狀類別只能宣告類別範圍中的類型。它們不會導致建立巢狀類別中所包含的物件。上述範例宣告兩個巢狀類別,但不會宣告這些類別類型的任何物件。 |
巢狀類別宣告範圍可視性的例外是同時宣告類型名稱和向前宣告。在這種情況下,向前宣告所宣告的類別名稱會在封入類別以外顯示,且其範圍定義為最小的封入非類別範圍。例如:
// nested_class_declarations_2.cpp
class C
{
public:
typedef class U u_t; // class U visible outside class C scope
typedef class V {} v_t; // class V not visible outside class C
};
int main()
{
// okay, forward declaration used above so file scope is used
U* pu;
// error, type name only exists in class C scope
u_t* pu2; // C2065
// error, class defined above so class C scope
V* pv; // C2065
// okay, fully qualified name
C::V* pv2;
}