Nazwy typu zagnieżdżonego
Microsoft C++ obsługuje deklaracji zagnieżdżonych typów — nazwanych i anonimowe.Anonimowe struktur i klasy są szczególne rozszerzenie Microsoft C++.Związki anonimowe są standardowe.
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
Uwagi
Pierwsza klasa nazwa powyżej odnosi się do klasy zewnętrzne; Druga odnosi się do klasy wewnętrznej.Nazwy te mogą dalej zagnieżdżone.W ten sposób,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
są wszystkie prawidłowe nazwy klas.Zamiast nazwy klasy identyfikatorów szablonu może służyć, przy użyciu słowa kluczowego opcjonalne szablonu w
MyClass<int>::Inner
Outer<int>::template Inner<int>
W niektórych sytuacjach programowania warto zdefiniować zagnieżdżonych typów.Te typy są widoczne tylko dla funkcji elementów członkowskich typu klasy, w której są zdefiniowane.One również były widoczne, tworząc kwalifikowana nazwa typu przy użyciu operatora zakres rozdzielczości (:).
[!UWAGA]
Jednej hierarchii powszechnie używane klasy, która zatrudnia zagnieżdżonych typów jest iostream.W plikach nagłówkowych iostream, definicji klasy ios zawiera serię Typy wyliczeniowe, które są pakowane do użytku tylko z biblioteki iostream.
Przykład
Poniższy przykład definiuje klas zagnieżdżonych:
// 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()
{
}
Aby dostęp nazwę zdefiniowaną w klasie zagnieżdżone, należy użyć operatora zakres rozdzielczości (:) do skonstruowania nazwy klasy kompletne.Użyj tego operatora jest wyświetlany w inicjowania z statyczne członków w poprzednim przykładzie.Aby użyć klasy zagnieżdżonych w programie, użyj kodu takich jak:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Zagnieżdżone anonimowe klasy lub struktury mogą być definiowane jako:
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
Klasa anonimowe musi być zagregowane nie funkcji elementów członkowskich i nie elementy statyczne.
KONIEC Microsoft szczególne
[!UWAGA]
Chociaż można zdefiniować typ wyliczany wewnątrz deklaracji klasy, odwrotnej nie jest prawdziwe; nie można zdefiniować typy klas wewnątrz deklaracji wyliczenia.