Nomi di tipo annidato
Microsoft C++ supporta la dichiarazione dei tipi annidati - sia denominato che anonimo.Strutture e le classi anonimi sono un'estensione specifica di Microsoft per C++.Le unioni anonime sono standard.
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
Note
Il primo nome della classe in precedenza si riferisce alla classe esterna, il secondo fa riferimento alla classe interna.Tali nomi possono essere ulteriormente annidato.Pertanto,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
sono tutti i nomi validi di classi.Anziché i nomi della classe, gli identificatori del modello possono essere utilizzati, con la parola chiave facoltativa del modello, ad esempio in
MyClass<int>::Inner
Outer<int>::template Inner<int>
In alcune situazioni di programmazione, sarà opportuno definire i tipi annidati.Questi tipi sono visibili solo alle funzioni membro della classe in definiti.È anche possibile rendere visibili costruire un nome di tipo completo utilizzando l'operatore di risoluzione dell'ambito (::).
[!NOTA]
Una gerarchia di classi di uso comune che utilizza tipi annidati è iostream.Nei file di intestazione iostream, la definizione di classe IOS include una serie di tipi enumerati, inclusi da utilizzare solo con la libreria iostream.
Esempio
Nell'esempio seguente vengono definite le classi annidate:
// 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()
{
}
Per accedere a un nome definito in una classe annidata, utilizzare l'operatore di risoluzione dell'ambito (::) per costruire un nome di classe completo.L'utilizzo di questo operatore è indicato nelle inizializzazioni di statico membri nell'esempio precedente.Per utilizzare una classe annidata nel programma, utilizzare il codice riportato di seguito:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Le classi anonime annidate o strutture possono essere definite come:
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
Una classe anonima deve essere un aggregato che non dispone di funzioni membro e membri statici.
Microsoft FINALE specifico
[!NOTA]
Sebbene un tipo enumerato possa essere dichiarazione interna definita la classe, l'opposto non è true, i tipi di classe non possono essere dichiarazioni interne designate di enumerazione.