Создание шаблонов
классов.
Точно так же как создаются абстрактные функции на основе шаблонов функций, создаются абстрактные классы на основе шаблонов классов. Шаблон класса описывает класс, который, в свою очередь, описывает объект. Когда вы создаете шаблон класса, компилятор считывает этот шаблон и определяет класс Затем вы создаете экземпляры объектов этого класса. Как видите, шаблоны классов определяют еще один уровень абстракции в концепции классов.
Шаблон класса определяется почти так же, как и шаблон функции, т.е. первой идет строе 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
();