Создание шаблонов классов.

Точно так же как создаются абстрактные функции на основе шаблонов функций, создаются абстрактные классы на основе шаблонов классов. Шаблон класса описывает класс, который, в свою очередь, описывает объект. Когда вы создаете шаблон класса, компилятор считывает этот шаблон и определяет класс Затем вы создаете экземпляры объектов этого класса. Как видите, шаблоны классов определяют еще один уровень абстракции в концепции классов.

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

Листинг 4. Определение шаблона класса

Template<class   Type>

class  CMyClass

{

protected:

Type data;

public:

CMyClass (Type arg) { data=agr;}

 ~CMyClass() {}

};

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

CMyClass<int> myClass (15);

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

CMyClass<float> myClass (15.75) ;

Рассмотрим более сложный пример. Предположим, что необходимо создать класс, обеспечивающий хранение двух значений и содержащий функцию-член для сравнения этих значений. В листинге 5 приведен текст программы, в которой реализован подобный класс. Прежде всего, в программе определяется шаблон класса, названый CCompare. В этом классе хранятся два значения, которые предоставляются функии-конструктору при вызове. Класс также включает обычные конструктор и деструктор, а также функции-члены для определения меньшего или большего из значении или проверки их на равенство.

Листинг 5.  - использование шаблона класса

#include<iostream.h>

template<class   Type>

class  CCompare

{

protected:

Type  arg1;

Type  arg2;

public:

CCompare(Type  arg1,   Type  arg2)

{

CCompare::arg1  = arg1;

CCompare::arg2  = arg2;

}

~CCompare()   {}

Type GetMin()

{

Type min;

if   (arg1  < arg2)

min = arg1;

else

min = arg2;

return min;

}

Type GetMax()

{

Type max;

if (arg1> arg2)

max= arg1;

else

max= arg2;

return max;

}

int Equal()

{

int equal;

if (arg1 == arg2)

equal = 1;

else

equal = 0;

return equal;

}

};

int main ()

{

CCompare <int> compare1(15,   25);

CCompare <double> compare2(254.78,   12.983);

CCompare <char> compare3('A',    'Z');

cout << "THE COMPARE1 OBJECT" << endl;

cout << "Lowest: " << compare1.GetMin()<<endl;

cout << "Highest: " << compare1.GetMin()<<endl;

cout << "Equal: " << compare1.Equal()<<endl;

cout << endl;

cout << "THE  COMPARE2  OBJECT" << endl;

cout << "Lowest: " << compare2.GetMin () << endl;

cout << "Highest: " << compare2.GetMax () << endl;

cout << "Equal: " << compare2.Equal () << endl;

cout << endl;

cout << "THE  COMPARE2  OBJECT" << endl;

cout << "Lowest: " << compare3.GetMin() << endl;

cout << "Highest: " << compare3.GetMax() << endl;

cout <<  "Equal: " << compare3.Equal () << endl;

cout << endl;

return ();

}

Главная программа создает на основе шаблона класса три различных объекта один из которых оперирует целыми числам, другой использует вещественные числа, а третий хранит и сравнивает переменные символьного типа. Создав указанные три объекта класса CCompare, функция main() вызывает функции-члены этих объектов с тем, чтобы вывести на экран информацию о данных, хранимых в каждом из трех объектов.

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

Template<class Type1, class Type2>

class CMyClass

{

protected:

Type1 data1;

Type2 data2;

Public:

CMyClass (Type1 arg1, Type2 arg2)

{

data1 = arg1;

data2 = arg2;

}

~CMyClass ()    {}

};

Для создания экземпляра объекта класса MyClass можно использовать, к примеру, следующую строку:

CMyClass<int, char>  myClass(15,'А') ;

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

Листинг 7. Использование конкретных типов данных в качестве параметров в шаблоне класса

#include<iostream.h>

Template<class Type1, class Type2, int num>

class CMyClass

{

protected:

Type1 data1;

Type2 data2;

int data3;

public:

CMyClass(Type1 arg1, Type2 arg2, int num)

{

data1 = arg1;

data2 = arg2;

data3 = num;

}

~CMyClass () {}

};

int main()

{

CMyClass<int, char, 0> myClass(15, 'A', 10);

return ();

Hosted by uCoz