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

6.2.2. Включение конструкторов в шаблон функции

Для инициализации элементов списка в шаблон CList следует добавить конструктор. Чтобы инициализировать массив Buffer, конструктор должен получить параметр типа T. (Конструктор не может просто инициализировать элементы массива Buffer стандартными значениями, например 0, так как ему не известен тип данных этих элементов.) Например, конструктор может быть объявлен в разделе public класса CList следующим образом.

// внутри раздела public класса CList:

CList (Т InitValue);

Конструктор можно реализовать так.

template <class Т, int I> CList <T, I>::CList (Т InitValue)

{

for (int N = 0; N<I; ++N)

Buffer [N] = InitValue;

}

В другом варианте конструктор можно полностью описать внутри определения шаблона.

Обратите внимание, что список параметров шаблона (<T, I>) не включается, когда название CList следует за операцией расширения области видимости. (Разработчики языка C++, по-видимому, посчитали повторение списка параметров излишним.) С помощью такого конструктора можно создать объект для хранения целочисленных значений и одновременно инициализировать все элементы списка нулевыми значениями.

CList <int, 100> IntList (0);

Подобным образом в следующем фрагменте создается и инициализируется объект для хранения списка структур типа Record.

struct Record

{

char Name [25];

char Phone [15] ;

};

// ...

Record Rec = {"", ""};

CList <Record, 50> RecordList (Rec);

Во вновь созданном объекте каждый элемент списка является структурой Record, в обоих полях которой записаны нулевые (пустые) строки.

Определение класса CList может включать конструктор по умолчанию (т.е. конструктор без параметров), тогда объект может быть создан без инициализации списка. Вспомните, что если существует конструктор, имеющий один или более параметров, компилятор не генерирует автоматически конструктор по умолчанию. Однако в определение класса CList можно добавить пустой конструктор явно.

CList (){};

Деструктор для шаблона класса определяется с использованием синтаксиса, подобного синтаксису конструктора. Например, деструктор класса CList объявлен в определении шаблона как

~CList ();

и может быть реализован следующим образом.

template <class Т, int I> CList <T, I>::~CList ()

{

// код деструктора

}

В листинге 6.1 приведено окончательное определение класса CList и его методов.

Листинг 6.1

// CList.h: файл заголовков шаблона класса CList

template <class Т, int I> class CList

{

public:

CList () {};

CList (T InitValue);

int Setltem (int Index, const Т SItem);

int Getltem (int Index, Т &Item);

private:

Т Buffer [I];

};

template <class T, int I> CList <T, I>::CList (T InitValue)

{

for (int N = 0; N < I; ++N)

Buffer [N] = InitValue;

}

template <class T, int I> int CList <T, I>::SetItem (int Index,

const T &Item)

{

if (Index < 0 I I Index > I - 1)

return 0;

Buffer [Index] = Item;

return 1;

}

template <class T, int I> int CList <T, I>::GetItem (int Index, T &ltem)

{

if (Index < 0 || Index > I - 1)

return 0;

Item = Buffer [Index];

return 1;

}