Поделиться через


Вложенные имена типов

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

Примечание

Хотя перечисляемый тип можно определить внутри объявления класса, обратное неверно; типы классов невозможно определить в объявлениях перечислений.

См. также

Ссылки

Спецификаторы типов C++