Types imbriqués

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Portée des membres - Index

Les balises ou les noms typedef déclarés dans une classe appartiennent lexicalement à la portée de cette classe. Pour accéder à ces noms, vous devez en général utiliser la notation xxx::yyy, sauf si vous êtes dans la portée de la classe appropriée.

Une classe déclarée dans une autre classe est appelée classe imbriquée. Son nom est local à la classe qui la contient ; la classe imbriquée se trouve dans la portée de la classe qui la contient. Il s'agit d'une imbrication purement lexicale. La classe imbriquée ne bénéficie d'aucun privilège supplémentaire pour accéder aux membres de la classe qui la contient (et vice-versa).

Vous pouvez imbriquer les classes de cette manière à un niveau arbitraire, dans la limite de la place disponible en mémoire. Les classes imbriquées peuvent être déclarées dans une classe et être définies plus tard. Par exemple,

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

En Borland C++ 2.0, toute balise ou tout nom typedef déclaré à l'intérieur d'une classe appartient en réalité à la portée globale (fichier). Par exemple :

struct foo
{
   enum bar { x };   // 2.0 rules: 'bar' belongs to file scope
                     // 2.1 rules: 'bar' belongs to 'foo' scope
};
bar x;

Le fragment précédent se compile sans erreur. Comme le code est illicite avec la version 2.1, un avertissement est émis :

Warning: Use qualified name to access nested type 'foo::bar'

Voir aussi