Namen der geschachtelten Typen
Microsoft C++ unterstützt die Deklaration von geschachtelten Typen – sowohl benannt als auch anonym. Anonyme Strukturen und Klassen sind sich eine Microsoft-spezifische Erweiterung für C++. Anonyme Unions sind Standard.
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
Hinweise
Der erste Klassennamen oberhalb verweist auf die äußere Klasse, während sich der zweite auf die interne Klasse bezieht. Diese Namen können weiter geschachtelt sein. Demnach sind
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
alle gültige Namen von Klassen. Anstelle der Klassennamen können Vorlagenbezeichner mit dem optionalen Vorlagenschlüsselwort verwendet werden, wie hier gezeigt:
MyClass<int>::Inner
Outer<int>::template Inner<int>
In einigen Programmierungssituationen ist es sinnvoll, geschachtelte Typen zu definieren. Diese Typen sind nur für Memberfunktionen des Klassentyps sichtbar, in dem sie definiert sind. Sie können auch sichtbar gemacht werden, indem ein qualifizierter Typname mithilfe des Bereichsauflösungsoperators (::) verwendet wird.
Hinweis
Eine häufig verwendete Klassenhierarchie, die geschachtelte Typen verwendet, ist iostream.In den iostream-Headerdateien enthält die Definition der Klasse ios eine Reihe von Enumerationstypen, die nur für die Verwendung mit der iostream-Bibliothek gepackt werden.
Beispiel
Im folgenden Beispiel werden geschachtelte Klassen definiert.
// 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()
{
}
Zum Zugriff auf einen Namen, der in einer geschachtelten Klasse definiert ist, verwenden Sie den Bereichsauflösungsoperator (::), um einen vollständigen Klassennamen zu erstellen. Die Verwendung dieses Operators wird in den Initialisierungen der static-Member im vorherigen Beispiel gezeigt. Zur Verwendung einer geschachtelten Klasse im Programm nutzen Sie Code wie beispielsweise:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Geschachtelte anonyme Klassen oder Strukturen können wie folgt definiert werden:
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
Eine anonyme Klasse muss ein Aggregat sein, das nicht über Memberfunktionen und statische Member verfügt.
END Microsoft-spezifisch
Hinweis
Obwohl ein enumerierter Typ innerhalb einer Klassendeklaration definiert werden kann, ist das Gegenteil nicht der Fall; Klassentypen können nicht innerhalb von Enumerationsdeklarationen definiert sein.