Déclarations de classes imbriquées
Une classe peut être déclarée dans la portée d'une autre classe.une telle classe est appelée « une classe imbriquée. » Les classes imbriquées sont prises dans la portée de la classe englobante et sont disponibles au sein de cette portée.Pour faire référence à une classe imbriquée d'une portée différente de celle de sa portée englobante immédiate, vous devez utiliser un nom qualifié complet.
l'exemple suivant montre comment déclarer les classes imbriquées :
// nested_class_declarations.cpp
class BufferedIO
{
public:
enum IOError { None, Access, General };
// Declare nested class BufferedInput.
class BufferedInput
{
public:
int read();
int good()
{
return _inputerror == None;
}
private:
IOError _inputerror;
};
// Declare nested class BufferedOutput.
class BufferedOutput
{
// Member list
};
};
int main()
{
}
BufferedIO::BufferedInput et BufferedIO::BufferedOutput déclarés dans BufferedIO.Ces noms de classe ne sont pas visibles hors de la portée de la classe BufferedIO.Toutefois, un objet de type BufferedIO ne contient pas d'objets des types BufferedInput ou BufferedOutput.
Les classes imbriquées peuvent utiliser directement des noms, les noms des types, les noms des membres statiques, et les énumérateurs uniquement de la classe englobante.Pour utiliser des noms d'autres membres de classe, vous devez utiliser des pointeurs, les références, ou des noms d'objet.
Dans l'exemple précédent d' BufferedIO , l'énumération IOError est accessible directement par les fonctions membres des classes imbriquées, BufferedIO::BufferedInput ou BufferedIO::BufferedOutput, comme indiqué dans la fonction good.
[!REMARQUE]
Les classes imbriquées déclarent uniquement des types dans la portée de classe.Ils n'entraînent pas les objets de la classe imbriquée à créer.L'exemple précédent déclare deux classes imbriquées mais ne déclare pas objet de ces types de classe.
Une exception à la visibilité de portée d'une déclaration de classe imbriquée est lorsqu'un nom de type est déclaré avec une déclaration anticipée.Dans ce cas, le nom de classe déclaré par la déclaration anticipée est visible à l'extérieur de la classe englobante, sa portée définie pour être la plus petite portée englobante de sans classe.Par exemple :
// nested_class_declarations_2.cpp
class C
{
public:
typedef class U u_t; // class U visible outside class C scope
typedef class V {} v_t; // class V not visible outside class C
};
int main()
{
// okay, forward declaration used above so file scope is used
U* pu;
// error, type name only exists in class C scope
u_t* pu2; // C2065
// error, class defined above so class C scope
V* pv; // C2065
// okay, fully qualified name
C::V* pv2;
}