Язык программирования C++. Вводный курс




Вложенные типы шаблонов классов


Шаблон класса QueueItem

применяется только как вспомогательное средство для реализации Queue. Чтобы запретить любое другое использование, в шаблоне QueueItem

имеется закрытый конструктор, позволяющий создавать объекты этого класса исключительно функциям-членам класса Queue, объявленным друзьями QueueItem. Хотя шаблон QueueItem

виден во всей программе, создать объекты этого класса или обратиться к его членам можно только при посредстве функций-членов Queue.

Альтернативный подход к реализации состоит в том, чтобы вложить определение шаблона класса QueueItem в закрытую секцию шаблона Queue. Поскольку QueueItem

является вложенным закрытым типом, он становится недоступным вызывающей программе, и обратиться к нему можно лишь из шаблона класса Queue и его друзей (например, оператора вывода). Если же сделать члены QueueItem

открытыми, то объявлять Queue другом QueueItem не понадобится.

Семантика исходной реализации при этом сохраняется, но отношение между шаблонами QueueItem и Queue

моделируется более элегантно.

Поскольку при любой конкретизации шаблона Queue

требуется конкретизировать тем же типом и QueueItem, то вложенный класс должен быть шаблоном. Вложенные классы шаблонов сами являются шаблонами классов, а параметры объемлющего шаблона можно использовать во вложенном:

template <class Type>

class Queue:

   // ...

private:

   class QueueItem {

   public:

      QueueItem( Type val )

               : item( val ), next( 0 ) { ... }

      Type item;

      QueueItem *next;

   };

   // поскольку QueueItem - вложенный тип,

   // а не шаблон, определенный вне Queue,

   // то аргумент шаблона <Type> после QueueItem можно опустить

   QueueItem *front, *back;

   // ...

};

При каждой конкретизации Queue

создается также класс QueueItem с подходящим аргументом для Type. Между конкретизациями шаблонов QueueItem и Queue

имеется взаимно однозначное соответствие.

Вложенный в шаблон класс конкретизируется только в том случае, если он используется в контексте, где требуется полный тип класса. В разделе 16.2 мы упоминали, что конкретизация шаблона класса Queue




Содержание  Назад  Вперед