Программирование >>  Дополнительные возможности наследования 

1 ... 190 191 192 [ 193 ] 194 195 196 ... 265


Параметризованные типы

с помошью шаблонов можно научить компилятор составлять список элементов любого типа, а не только заданного: PartsList - это список частей, CatsList - это список кошек. Единственное отличие между ними - тип элементов списка. При использовании шаблонов тип элементов списка становится параметром для определения класса.

Обшим компонентом практически всех библиотек С++ является класс массивов. Как показано на примере с классом List, утомительно и крайне неэффективно создавать один класс массивов для целых, другой - для двойных слов, а еше один - для массива элементов типа Animals. Шаблоны позволяют объявить параметризованный класс массивов, а затем указать, какой тип объекта будет содержаться в каждом экземпляре массива. Заметьте, что стандартная библиотека шаблонов предоставляет стандартизированный набор контейнерных классов, включая массивы, списки и т.д. Сейчас мы выясняем, что нужно для создания вашего собственного класса, только для того, чтобы вы до конца поняли, как работают шаблоны; но в коммерческой профамме вы почти стопроцентно будете использовать классы библиотеки STL, а не собственного изготовления.

Создание зкземиляра шаблона

Экземпляризация (instantiation) - это операция создания определенного типа из шаблона. Отдельные классы называются экземплярами шаблона.

Параметризованные шаблоны (parameterized templates) предоставляют возможность создания общего класса и для построения конкретных экземпляров передают этому классу в качестве парамефов типы данных.

ПОъявление таОлона

Объявляем параметризованный объект Array (шаблон для массива) путем записи следующих строк:

1: template <class Т> объявляем шаблон и параметр 2: class Array параметризуемый класс

3: {

4: public: 5: Array О;

6: здесь должно быть полное определение класса 7; } ;

Ключевое слово template используется в начале каждого объявления и определения класса шаблона. Параметры шаблона располагаются за ключевым словом template. Параметры - это элементы, которые изменяются с каждым экземпляром. Например, в приведенном выше шаблоне массивов будет изменяться тип объектов, сохраняемых в массиве. Один экземпляр шаблона может хранить массив целых чисел, а другой - массив объектов класса Animals.

В этом примере используется ключевое слово class, за которым следует идентификатор т. Это ключевое слово означает, что параметром является тип. Идентификатор Т используется в остальной части определения шаблона, указывая тем самым на пара-мефизованный тип. В одном экземпляре этого класса вместо идентификатора Т повсюду будет стоять тип int, а в другом - тип Cat.



Чтобы объявить экземпляры параметризованного класса Array для типов int и Cat, следует написать:

Array<int> anIntArray; Array<Cat> aCatArray;

Объект anIntArray представляет собой массив целых чисел, а объект aCatArray - массив элементов типа Cat. Теперь вы можете использовать тип Array<int> в любом месте, где обычно указывается какой-либо тип - для возвращаемого функцией значения, для параметра функции и т.д. В листинге 19.1 содержится полное объявление уже рассмотренного нами щаблона Array.

ПРИМЕЧАНИЕ

Программа в листинге 19.1 не завершена!

Лисшииг 18.1. ШаОдпи кдасса Array

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Листинг 19.1. Шаблон класса массивов Sinclude <iostream.h> const int DefaultSize = 10;

template <class T> объявляем шаблон и параметр class Array параметризуемый класс

public:

конструкторы

Arraydnt itsSize = DefaultSize); Array(const Array &rhs); ArrayO { delete [] pType; }

операторы

Arrays, operator=(const Array&);

T& operator[](int offSet) { return pType[offSet]; }

методы доступа

int getSizeO { return itsSize; }

private: T *pType; int itsSize;

Результатов нет. Эта программа не завершена.

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



Со строки 6 и до конца определения шаблона (строка 24) вся остальная часть объявления аналогична любому другому объявлению класса. Единственное отличие заключается в том, что везде, где обычно должен стоять тип объекта, используется идентификатор Т. Например, можно предположить, что operator[] должен возвращать ссьшку на объект в массиве, а на самом деле он объявляется для возврата ссылки на идентификатор типа Т.

Если объявлен экземпляр целочисленного массива, перегруженный оператор присваивания этого класса возвратит ссылку на тип integer. А при объявлении экземпляра массива Animal оператор присваивания возвратит ссылку на объект типа Animal.

Испильзовапив имвпи шаблопа

Внутри объявления класса слово Array может использоваться без спецификаторов. В другом месте профаммы этот класс будет упоминаться как Аггау<Т>. Например, если не поместить консфуктор внутри объявления класса, то вы должны записать следующее:

template <class Т> Array<T>::Array(int size): itsSize = size {

pType = new T[size];

for (int 1 = 0; Ksize: i++)

pType[i] = 0;

Объявление, занимающее первую строку этого фрагмента кода, устанавливает в качестве парамефа тип данных (class Т). В таком случае в профамме на шаблон можно ссьшаться как Аггау<Т>, а объявленную функцию-член вызывать строкой

Arraydnt size).

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

Выполнвнив шаблона

Для выполнения класса шаблона Array необходимо создать конструктор-копировщик, перефузить оператор присваивания (operator=) и т.д. В листинге 19.2 показана простая консольная профамма, предназначенная для выполнения этого шаблона.


ОРШЕЧАНКЕ

Некоторые более старые компиляторы не поддерживают использование шаблонов. Но шаблоны являются частью стандарта ANSI С++, поэтому компиляторы всех основных производителей поддерживают шаблоны в своих текущих версиях. Если у вас очень старый компилятор, вы не сможете компилировать и выполнять упражнения, приведенные в этой главе. Однако все же стоит прочитать ее до конца, а затем вернуться к этому материалу после модернизации своего компилятора.



1 ... 190 191 192 [ 193 ] 194 195 196 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика