Zagnieżdżone nazwy typów
Microsoft C++ obsługuje deklaracje typów zagnieżdżonych — nazwanych i anonimowych. Klasy i struktury anonimowe są specyficznym dla firmy Microsoft rozszerzeniem języka 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
Nazwa pierwszej klasy powyżej odnosi się do klasy zewnętrznej; druga odnosi się do klasy wewnętrznej. Nazwy te mogą być dalej zagnieżdżane.Tak więc,
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
są prawidłowymi nazwami klas. Zamiast nazw klas, można użyć identyfikatorów szablonu, z opcjonalnym słowem kluczowym template, jak w
MyClass<int>::Inner
Outer<int>::template Inner<int>
W niektórych sytuacjach w programowaniu, warto zdefiniować typy zagnieżdżone.Typy te są widoczne tylko dla funkcji członkowskich typu klasy, w której są zdefiniowane.Mogą być również uwidocznione przez utworzenie kwalifikowanej nazwy typu za pomocą operatora rozpoznawania zakresu (::).
[!UWAGA]
Iostream jest jedną z często używanych hierarchii klas, która używa typów zagnieżdżonych.W plikach nagłówkowych iostream, definicja klasy ios zawiera serię typów wyliczeniowych, które są pakowane do użytku tylko z biblioteką iostream.
Przykład
W poniższym przykładzie zdefiniowano klasy zagnieżdżone:
// 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 uzyskać dostęp do nazwy zdefiniowanej w klasie zagnieżdżonej, należy użyć operatora rozpoznawania zakresu (::), aby skonstruować kompletną nazwę klasy.Sposób użycia tego operatora został pokazany w inicjacji statycznych elementów członkowskich w poprzednim przykładzie.Aby użyć klasy zagnieżdżonej w programie, należy użyć kodu takiego jak:
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Zagnieżdżone struktury lub klasy anonimowe można zdefiniować jako:
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
Klasa anonimowa musi być agregacją, która nie ma funkcji członkowskich ani elementów statycznych.
KONIEC informacji specyficznych dla firmy Microsoft
[!UWAGA]
Chociaż można zdefiniować typ wyliczeniowy wewnątrz deklaracji klasy, nie można zrobić na odwrót; nie można zdefiniować typów klas wewnątrz deklaracji wyliczenia.