Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++ глава 6.doc
Скачиваний:
5
Добавлен:
05.11.2018
Размер:
93.7 Кб
Скачать

6.2.1. Создание объектов по шаблонам

При создании объекта по шаблону класса нужно точно определить значения параметров шаблона. По аналогии с приведенным выше примером класса, не являющимся шаблоном, можно создать экземпляр шаблона класса CList для хранения в списке не более 100 целочисленных значений.

CList <int, 100> IntList;

Это объявление описывает IntList как экземпляр версии CList, в которой каждое вхождение параметра т заменяется типом int, а каждое вхождение параметра I — константой 100. В результате, в полученном объекте элемент Buffer будет определен как массив из 100 целочисленных значений типа int, а функциям-членам SetItem и GetItem будут переданы ссылки на значения типа int (в соответствии со вторым параметром).

Обратите внимание: согласно списку параметров в определении шаблона CList

<class Т, int I>

при создании объекта необходимо присвоить первому параметру шаблона корректное описание типа, а второму – константное значение типа int (или другое значение, которое можно преобразовать в тип int) или константную переменную типа int, инициализируемую константным выражением. Нельзя передать второй параметр как не константную переменную или как константную переменную, инициализируемую другой переменной.

После создания объекта и задания всех типов в списке параметров, компилятор автоматически обеспечивает работу с этими типами при последующем обращении к переменным-членам или вызове функций-членов класса. Таким образом, в объекте intList в метод SetItem нужно передать два значения типа int.

IntList.Setltem(0,5); //первому элементу списка присваивается целое

//число

Чтобы создать объект для хранения списка строк, экземпляр CList можно определить так.

CList <char *, 25> StringList;

Тогда для присваивания строки какому-либо элементу списка следует в функции Setltem передать второму параметру указатель на массив типа char.

StringList.Setltem (0, "Mike"); // присваивает строку первому

// элементу списка

Объект для хранения списка значений типа double создается следующим образом.

CList «double, 25> *DoubleList;

DoubleList = new CList <double, 25>;

Обратите внимание: при определении типа указателя DoubleList, так же как и при задании типа в операторе new, вместе с именем шаблона следует включить список его параметров <double, 25>. Список параметров шаблона является неотъемлемой частью определения типа. Одного имени шаблона недостаточно для представления типа, так как оно адресует семейство типов.

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

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

struct Record

{

char Name [25] ;

char Prione [15];

}

void main ()

{

// создание объекта для хранения списка, содержащего не более

// 50 структур типа Record:

CList <Record, 50> RecordList;

// создание и инициализация экземпляра структуры Record:

Record Rec =

{

"John",

"287-981-0119"

};

// копирование содержимого объекта Rec в первый элемент списка:

RecordList.Setltem (0, Rec) ;

// продолжение функции main ...

}

Совет

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