Noms de types imbriqués
Microsoft C++ prend en charge les déclarations des types imbriqués (nommées et anonymes). Les structures et les classes anonymes sont une extension spécifique de Microsoft dans C++. Les unions anonymes sont standard.
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
Notes
Le premier nom de classe ci-dessus fait référence à la classe externe ; le deuxième fait référence à la classe interne. Ces noms peuvent être plus imbriqués. Donc
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
ils sont tous des noms de classes valides. À la place des noms de classe, des identificateurs de modèle peuvent être utilisés, avec le mot clé de modèle facultatif, comme dans
MyClass<int>::Inner
Outer<int>::template Inner<int>
Dans certaines situations de programmation, il est utile de définir les types imbriqués. Ces types sont visibles uniquement par les fonctions membres du type de classe dans lequel ils sont définis. Ils peuvent également être rendus visibles en construisant un nom qualifié de type à l'aide de l'opérateur de résolution de portée (::).
Notes
Une hiérarchie de classes couramment utilisée qui utilise les types imbriqués est iostream.Dans les fichiers d'en-tête iostream, la définition de la classe ios comprend une série de types énumérés, empaquetés destinée uniquement à être utilisée avec la bibliothèque iostream.
Exemple
L'exemple suivant définit les classes imbriquées :
// nested_type_names1.cpp
class WinSystem
{
public:
class Window
{
public:
Window(); // Default constructor.
~Window(); // Destructor.
int NumberOf(); // Number of objects of class.
int Count(); // Count number of objects of class.
private:
static int CCount;
};
class CommPort
{
public:
CommPort(); // Default constructor.
~CommPort(); // Destructor.
int NumberOf(); // Number of objects of class.
int Count(); // Count number of objects of class.
private:
static int CCount;
};
};
// Initialize WinSystem static members.
int WinSystem::Window::CCount = 0;
int WinSystem::CommPort::CCount = 0;
int main()
{
}
Pour accéder à un nom défini dans une classe imbriquée, utilisez l'opérateur résolution-portée (::) pour construire un nom de classe complet. L'utilisation de cet opérateur est montrée dans les initialisations des membres statique dans l'exemple précédent. Pour utiliser une classe imbriquée dans votre programme, utilisez un code comme :
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Les classes ou les structures anonymes imbriquées peuvent être définies comme suit :
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
Une classe anonyme doit être un agrégat qui n'a aucune fonction membre et aucun membre statique.
FIN spécifique à Microsoft
Notes
Bien qu'un type énuméré puisse être défini dans une déclaration de classe, l'inverse n'est pas vrai ; des types de classe ne peuvent pas être définis dans les déclarations d'énumération.