共用方式為


巢狀類型名稱

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 專有的

注意事項注意事項

雖然列舉類型可以在類別宣告內定義,但是反向執行則不成立,因為類別類型無法在列舉類型宣告內定義。

請參閱

參考

C++ 類型規範