巢狀類型名稱
Microsoft C++ 支援宣告巢狀類型,包括具名和匿名。匿名結構和類別是 Microsoft 的 C++ 專有擴充功能。匿名等位為標準功能。
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
備註
上面第一個類別名稱參考外部類別,第二個則參考內部類別。這些名稱可能會進一步巢狀。 因此,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
全都是類別的有效名稱。範本識別項可以用來取代類別名稱,並搭配選擇性的範本關鍵字,如同以下所示
MyClass<int>::Inner
Outer<int>::template Inner<int>
某些程式設計的情況適合定義巢狀類型。 這些類型只有本身定義所在之類別類型的成員函式能夠看見。 另外可以透過使用範圍解析運算子 (::) 建構限定類型名稱讓它們顯示。
注意事項 |
---|
採用巢狀類型的一種常用類別階層為 iostream。在 iostream 標頭檔中,ios 類別的定義包含一系列的列舉類型,這些類型會加以封裝並且僅供搭配 iostream 程式庫使用。 |
範例
下列範例將定義巢狀類別:
// nested_type_names1.cpp
class WinSystem
{
public:
class Window
{
public:
Window(); // Default constructor.
~Window(); // Destructor.
int NumberOf(); // Number of objects of class.
int Count(); // Count number of objects of class.
private:
static int CCount;
};
class CommPort
{
public:
CommPort(); // Default constructor.
~CommPort(); // Destructor.
int NumberOf(); // Number of objects of class.
int Count(); // Count number of objects of class.
private:
static int CCount;
};
};
// Initialize WinSystem static members.
int WinSystem::Window::CCount = 0;
int WinSystem::CommPort::CCount = 0;
int main()
{
}
若要存取巢狀類別中定義的名稱,請使用範圍解析運算子 (::) 建構完整的類別名稱。 這個運算子的用法已在前一個範例的 static 成員初始化中說明。 若要在程式中使用巢狀類別,請使用如下所述的程式碼:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
巢狀匿名類別或結構可以定義如下:
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
匿名類別必須是沒有成員函式和靜態成員的彙總。
END Microsoft 專有的
注意事項 |
---|
雖然列舉類型可以在類別宣告內定義,但是反向執行則不成立,因為類別類型無法在列舉類型宣告內定義。 |