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


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

Microsoft C++ поддерживает объявление вложенных типов - и неименованные и анонимная.Анонимные структуры и классы расширения Майкрософт, определенное в C++.Безымянные соединения стандартны.

[::] 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

все допустимые имена классов.Вместо имен класса, идентификаторы шаблона могут быть использованы с дополнительно указываемым ключевым словом шаблона, как в выражениях

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()
{
}

Для доступа к имя, указанное во вложенном классе, используйте оператор разрешения области действия (::построение полное имя класса.)Использование этого оператора отображается в инициализациях Статический члены в предыдущем примере.Для использования вложенного класса в программе используйте код:

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()
{
}

Анонимный класс должен быть агрегатом, который не содержит функции-члены и статические элементы.

ЭЛЕМЕНТ, относящийся Майкрософт

ПримечаниеПримечание

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

См. также

Ссылки

Описатели типа C++