巢狀的類別宣告

類別可宣告另一個類別的範圍內。這種類別稱為 「 巢狀 」 結構類別。" 巢狀的類別會視為是封入類別的範圍內,並可供使用,該範圍內。若要從其立即封入的範圍以外的其他範圍參照巢狀類別,您必須使用完整限定的名稱。

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

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

請參閱

參考

類別、 結構和等位