Verschachtelte Typen

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

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 Appmethod C++ 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