Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 6. Шаблоны классов

215

Синтаксис описания шаблона:

template <описание_параметров_шаблона> определение_класса;

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

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

template <class Data> class List{ class Node{ public: Data d; Node *next; Node *prev;

NodeCData dat = 0){d = dat: next - 0: prev - 0:} }:

} Класс Data можно рассматривать как формальный параметр, на место которого при компиляции будет подставлен конкретный тип данных.

Для любых параметров шаблона могут быть заданы значения по умолчанию, например:

tempiate<class T> class myarray {/*„.*/};

templateslass K, class V. tempiate<class T> class С - myarray> class Map{

C<K> key;

C<V> value;

}: ~ Область действия параметра шаблона — от точки описания до конца шаблона, поэтому параметр можно использовать при описании следующих за ним, например:

tempiate<class Т. Т* p. class U = Т> class X { /* ... */ }; Методы шаблона класса автоматически становятся шаблонами функций. Если метод описывается вне шаблона, его заголовок должен иметь следующие элементы:

tempi ate <описание_параметров_шаблона>

возвр_тип имя_класса <параметры_шаблона>:: имяфункции (список_параметров функции)

Описание параметров шаблона в заголовке функции должно соответствовать шаблону класса, при этом имена параметров могут не совпадать. Проще рассмотреть синтаксис описания методов шаблона на примере:

template <class Data> void List<Data>::print() { /* тело функции */ }

216

Часть II. Объектно-ориентированное программирование

Здесь <class Data>— описание параметра шаблону, void — тип возвращаемого функцией значения, List — имя класса, <Data>— параметр шаблона, print — имя функции без параметров.

В случае нескольких параметров порядок их следования в описании_параметров и параметрах_шаблона должен быть один и тот же, например:

tempiate<class Tl, class T2> struct A{ void fl();

}:

templates!ass T2. class Tl> void A<T2, Tl>::fl(){ ... }

Ниже перечислены правила описания шаблонов.

  • Локальные классы не могут содержать шаблоны в качестве своих элементов.

  • Шаблоны методов не могут быть виртуальными.

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

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

  • Внутри шаблона нельзя определять friend-шаблоны.

В качестве примера шаблона рассмотрим полное описание параметризованного класса двусвязного списка List.

template <class Data> class List{ class Node{ public: Data d:

Node *next. *prev; Node(Data dat = 0){d = dat: next = 0: prev =0:}

}:

Node *pbeg. *pend;

public:

List(){pbeg = 0: pend = 0:}

-ListO;

void add(Data d):

Node * find(Data i):

Node * insert(Data key. Data d);

bool remove(Data key);

void printO;

void print_back();

}:

//

template <class Data> List <Data>::4ist(){ if (pbeg !=0){ Node *pv = pbeg; while (pv){

pv = pv->next; delete pbeg; pbeg = pv;}