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 sie 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 sie 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' ist ein typedef-Name
   struct inner    // 'outer::inner' ist eine°Klasse
   {
      static int x;
   };
   static int x;
      int f();
   class deep;     // geschachtelte Deklaration
};
int outer::x;     // definiert statisches Datenelement
int outer::f() (
   t x;           // 't' hier direkt sichtbar
   return x;
   }
int outer::inner::x;    // definiert statisches Datenelement
outer::t x;             // Hier muss 'outer::t' verwendet werden.
class outer::deep { };  // geschachtelte Klasse hier definieren

In der Version 2.0 von Borland 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-Regeln: 'bar' gehört zum Dateigültigkeitsbereich
                     // 2.1-Regeln: 'bar' gehört zum Gültigkeitsbereich 'foo'
};
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