Программирование >>  Программирование на языке c++ 

1 ... 71 72 73 [ 74 ] 75 76 77 ... 159


6. ПАРАМЕТРИЗИРОВАННЫЕ КЛАССЫ (TEMPLATES)

6.1. Введение

в параметризированные классы

Параметризированный класс - это некий шаблон (template), на основе которого можно строить другие классы. Его можно рассматривать как некое описание множества классов, отличающихся, например, только типами их данных. Хорошими примерами параметризированных классов могут быть списки, массивы, ассоциативные (связанные) массивы, множества и т. п.

Шаблон классов (class template) определяет правила построения каждого отдельного класса из множества разрешенных (допустимых) классов. Это во многом напоминает то, как объявление класса определяет правила построения отдельных объектов этого класса (рис. 6.1). Рассмотрим пример:

template <class Туре>

class array {

Type *contents;

int size; public:

array(int number) { contents=new Type[size=number];} -arrayO { delete[] contents; } Type& operator[] (int x) { if((x<0)(x>=size))

{ сегг ошибочный индекс\п ; x=0; } return contents[x]; }



Параметрами шаблона могут быть одни или несколько типов к/нли допоянктеяьиые аргументы

template

Задает правила построения множества классов (множества новых типов, определенных пользователем)

Например, класс целых - int

Например, класс символов - char

Например, класс студентов - student, где student - опре-jipRSHHbm пользователем тип (другой класс)

Класс 1

Класс!

Класс п

Задает правила построения множества объектов

Абстракция

Объект 1

Объект j

Об-ьект п

Реальность

Рис. 6.1. Взаимосвязь между шаблонами и классами

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

После объявления класса array можно описать различные объекты этого класса, например:

array<int> int a(50); массив целых чисел array<char> char a(100); массив символов array<float> float a(30); массив действительных чисел

Описание начинается с имени класса (array), после которого идет наименование конкретного типа в угловых скобках (например, <char>). Далее, как обычно, задается имя объекта.

8 В. А. Скляров



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

В представленном выше классе array все функции класса были описаны внутри этого класса и являются поэтому inline функциями. Однако их можно описать и вне класса с учетом следующего правила: эти функции в общем случае являются параметризированными, так как могут использовать изменяемый тип, заданный в виде параметра, т. е. их надо описывать как функции-шаблоны (функции template). Рассмотрим пример:

Туре& array<Type>::operator[](int х) { if ((x<0)(x>=size)) { сегг ошибочньт индекс\п ;

х=0; }

return contents[x]; }

Рис. 6.1 обобщает основные правила использования шаблона и показывает взаимосвязь двух цепочек шаблон - класс и класс - объект . Заменим на рис. 6.1 слово класс словом массив . Тогда по шаблону можно построить абстрактный тип для: массива целых, ... , массива символов, ... , массива студентов. Конечно, класс студент должен быть предварительно описан, например:

class student { класс студент int group; номер группы int age; возраст

char name[20]; имя размером до 19 символов public:

get average of evaluation( . . . ); функция

............................ };

Теперь по заданному типу, например, массив символов, можно построить реально существующие экземпляры (ins-



1 ... 71 72 73 [ 74 ] 75 76 77 ... 159

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