巢狀的類別宣告
類別可宣告另一個類別的範圍內。 這種類別稱為 「 巢狀 」 結構類別。" 巢狀的類別會視為是封入類別的範圍內,並可供使用,該範圍內。 若要從其立即封入的範圍以外的其他範圍參照巢狀類別,您必須使用完整限定的名稱。
下列範例會示範如何宣告巢狀的類別:
// 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範例,列舉型別IOError成員函式中的巢狀類別,可以直接存取BufferedIO::BufferedInput或BufferedIO::BufferedOutput函式所示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;
}