Verschachtelte Typen
Nach oben zu Gültigkeitsbereich von Elementen - Index
Tag oder typedef-Namen, die innerhalb einer Klasse deklariert werden, gehören lexikalisch zum Gültigkeitsbereich dieser Klasse. Auf derartige Namen kann generell nur über die Notation xxx::yyy zugegriffen werden - wenn der aktuelle Gültigkeitsbereich nicht mit dem der einschließenden Klasse übereinstimmt.
Eine Klasse, die innerhalb einer anderen Klasse deklariert wird, heißt geschachtelte Klasse. Ihr Name ist lokal bezüglich der sie einschließenden Klasse; die geschachtelte Klasse liegt im Gültigkeitsbereich der einschließenden Klasse. Dies kann man als rein lexikalische Schachtelung bezeichnen. Die geschachtelte Klasse besitzt keinerlei zusätzliche Privilegien für den Zugriff auf Elemente der einschließenden Klasse (dies gilt umgekehrt auch für die einschließende Klasse).
Klassen können auf diese Art und Weise in beliebige Tiefe geschachtelt werden (nur durch die Speicherkapazität beschränkt). Geschachtelte Klassen lassen sich innerhalb einer Klasse deklarieren und später definieren. Zum Beispiel:
struct outer { typedef int t; // 'outer::t' is a typedef name struct inner // 'outer::inner' is a class { static int x; }; static int x; int f(); class deep; // nested declaration }; int outer::x; // define static data member int outer::f() { t x; // 't' visible directly here return x; } int outer::inner::x; // define static data member outer::t x; // have to use 'outer::t' here class outer::deep { }; // define the nested class here
Mit C++Builder gehören Tag-Namen und typedef-Namen, die innerhalb einer Klasse deklariert werden, zu dem globalen (Datei-)Gültigkeitsbereich. Ein Beispiel:
struct foo { enum bar { x }; // 2.0 rules: 'bar' belongs to file scope // 2.1 rules: 'bar' belongs to 'foo' scope }; bar x;
Der obige Programmtext wird fehlerfrei compiliert. Da er jedoch entsprechend den Regeln für Version 2.1 nicht korrekt ist, wird folgende Warnung ausgegeben:
Warnung: Use qualified name to access nested type 'foo::bar'
Siehe auch
- C++-Klassen
- Klassentypen
- Gültigkeitsbereich Klasse
- Klassenobjekte
- Klassen-Member-Liste
- Member-Funktionen
- Das Schlüsselwort this
- Statische Elemente
- Inline-Funktionen
- Gültigkeitsbereich von Elementen
- Element-Zugriffskontrolle
- Zugriff auf Basisklassen und abgeleitete Klassen
- Virtuelle Basisklassen
- Friends von Klassen