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' est un nom typedef
    struct inner    // 'outer::inner' est une classe
    {
       static int x;
    };
    static int x;
       int f();
    class deep;     // déclaration imbriquée
 };
 int outer::x;      // définit donnée membre statique
 int outer::f() {
    t x;            // 't' directement visible ici
    return x;
    }
 int outer::inner::x;    // définit donnée membre statique
 outer::t x;             //  doit utiliser 'outer::t' ici
 class outer::deep { };  // définit la classe imbriquée ici



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 };   // règles 2.0 : 'bar' appartient à la portée de fichier
                      // règles 2.1 : 'bar' appartient à la portée 'foo'
 };
 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 :



 Avertissement : Utiliser le nom qualifié pour accéder au type imbriqué 'foo::bar'



Voir aussi