Вложенные имена типов
Microsoft C++ поддерживает объявление вложенных типов — как именованных, так и анонимных. Анонимные структуры и классы являются расширением C++, характерным для систем Microsoft. Анонимные объединения являются стандартными.
[::] class-name :: class-name
[::] template-id :: class-name
[::] class-name :: template-id
[::] template-id :: template template-id
:: template template-id :: template template-id
Заметки
Первое указанное выше имя класса относится к внешнему классу; второе — к внутреннему классу. В дальнейшем эти имена могут быть вложенными. Таким образом, выражение
Outer::Inner
::Outer::Inner
::Outer::Inner::Inner2
представляет собой все допустимые имена классов. Вместо имен классов можно использовать идентификаторы шаблонов с необязательным ключевым словом template, как показано в следующем примере.
MyClass<int>::Inner
Outer<int>::template Inner<int>
В некоторых ситуациях при программировании имеет смысл определить вложенные типы. Эти типы видны только функциям-членам типа класса, в котором они определены. Также их можно сделать видимыми, создав полное имя типа с помощью оператора разрешения области действия (::).
Примечание
Одной из наиболее часто используемых иерархий классов, в которых используются вложенные типы, является iostream.В файлах заголовков iostream определение класса ios содержит ряд перечисляемых типов, упакованных для использования только с библиотекой iostream.
Пример
Ниже представлен пример определения вложенных классов.
// 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()
{
}
Чтобы получить доступ к имени, определенному во вложенном классе, используйте оператор разрешения области действия (::) для создания полного имени класса. Использование этого оператора показано в инициализациях членов static в предыдущем примере. Для использования вложенного класса в программе используйте следующий код.
WinSystem::Window Desktop;
WinSystem::Window AppWindow;
cout << "Number of active windows: " << Desktop.Count() << "\n";
Вложенные анонимные классы или структуры можно определить следующим образом.
// nested_type_names2.cpp
class Ledger
{
class
{
public:
double PayableAmt;
unsigned PayableDays;
} Payables;
class
{
public:
double RecvableAmt;
unsigned RecvableDays;
} Receivables;
};
int main()
{
}
Анонимный класс должен быть агрегатом, не содержащим функции-члены и статические члены.
Завершение блока, относящегося только к системам Microsoft
Примечание
Хотя перечисляемый тип можно определить внутри объявления класса, обратное неверно; типы классов невозможно определить в объявлениях перечислений.