Type imbriqué noms
Déclaration d'un support Microsoft C++ des types imbriqués - nommé et anonyme.Les structures anonymes et les classes sont une extension spécifique de Microsoft à 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 obtenir de imbriqués.ainsi,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
sont tous des noms valides de classes.À la place des noms de classe, des identificateurs de modèle peuvent être utilisés, avec le mot clé facultatif de modèle, 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 aux fonctions membres de la 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 (: :).
[!REMARQUE]
Une hiérarchie de classes couramment utilisées qui utilise les types imbriqués est iostream.Dans les fichiers d'en-tête iostream, la définition de la classe IOS inclut une série de types énumérés, qui sont intégrés à être utilisée uniquement avec la bibliothèque iostream.
Exemple
L'exemple suivant définit des 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 de résolution de portée (: :) pour construire un nom de classe complet.l'utilisation de cet opérateur est montrée dans les initialisations des membres de statique dans l'exemple précédent.Pour utiliser une classe imbriquée dans votre programme, utilisez du code tel que :
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Les classes anonymes imbriquées ou les structures 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 pas de fonctions membre et aucun membre statique.
détail de FIN Microsoft
[!REMARQUE]
Bien qu'un type énuméré puisse être défini à l'intérieur d'une déclaration de classe, l'inverse n'est pas vrai ; les types de classe ne peuvent pas être définis dans les déclarations d'énumération.