共用方式為


巢狀類別宣告

可以在某個類別的範圍內宣告另一個類別。 這種類別稱為「巢狀類別」。巢狀類別被視為在封入類別的範圍內,可在該範圍內使用。 若要在直接封入範圍以外參考巢狀類別,則必須使用完整名稱。

下列範例顯示如何宣告巢狀類別:

// 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;
}

請參閱

參考

類別、結構和等位