Freigeben über


Geschachtelte Klassendeklarationen

Eine Klasse kann im Bereich einer anderen Klasse deklariert werden. Eine solche Klasse wird als "geschachtelte Klasse" bezeichnet. Geschachtelte Klassen gelten als innerhalb des Bereichs der einschließenden Klasse befindlich und sind für die Verwendung innerhalb dieses Bereichs verfügbar. Um auf eine geschachtelte Klasse aus einem anderen als dem unmittelbar einschließenden Bereich zu verweisen, müssen Sie einen vollqualifizierten Namen angeben.

Im folgenden Beispiel wird das Deklarieren geschachtelter Klassen veranschaulicht:

// 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 und BufferedIO::BufferedOutput werden innerhalb BufferedIO deklariert. Diese Klassennamen sind außerhalb des gültigen Bereichs der Klasse BufferedIO nicht sichtbar. Ein Objekt vom Typ BufferedIO enthält jedoch keine Objekte des Typs BufferedInput oder BufferedOutput.

Geschachtelte Klassen können Namen, Typnamen, Namen statischer Member und Enumeratoren nur aus der einschließenden Klasse direkt verwenden. Um Namen von anderen Klassenmembern zu verwenden, müssen Sie Zeiger, Verweise oder Objektnamen verwenden.

Im vorherigen Beispiel mit BufferedIO kann auf die Enumeration IOError direkt von Memberfunktionen in den geschachtelten Klassen BufferedIO::BufferedInput oder BufferedIO::BufferedOutput zugegriffen werden, wie in der good-Funktion gezeigt wird.

Hinweis

Geschachtelte Klassen deklarieren nur Typen innerhalb des gültigen Klassenbereichs.Sie führen nicht dazu, dass enthaltene Objekte der geschachtelten Klasse erstellt werden.Das vorhergehende Beispiel deklariert zwei geschachtelte Klassen, jedoch keine Objekte dieser Klassentypen.

Eine Ausnahme von der Bereichssichtbarkeit einer Deklaration der geschachtelten Klasse ist, wenn ein Typname zusammen mit einer Vorwärtsdeklaration deklariert ist. In diesem Fall ist der Klassenname, der von der Vorwärtsdeklaration deklariert wird, außerhalb der einschließenden Klasse sichtbar, wobei sein Bereich als kleinster einschließender Nichtklassenbereich definiert wird. Beispiel:

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

Siehe auch

Referenz

Klassen, Strukturen und Unions