Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Пример. Представим, что нам необходимы стек целых чисел и стек контроллеров, управляющих температурой. Мы могли бы описать два стека:
class IntStack {
int stack[100];
...
};
class ControllerStack {
Controller* stack[100];
...
};
Другой, более разумный, подход – создать универсальный стек, который мог бы хранить элементы любого нужного нам типа. Для этого мы можем описать стек, содержащий указатели на нетипизированные элементы:
class Stack {
void* stack[100];
...
};
Однако это не безопасно с точки зрения типов. Никто не гарантирует нам, что пользователь не поместит в стек элемент одного типа, а взять захочет элемент другого типа.
Для реализации нашей идеи необходимо воспользоваться шаблоном или параметризованным классом. Шаблон служит для построения других классов и может быть параметризован другими классами, объектами или операциями.Использование шаблонов реализует в языке С++ особый тип полиморфизма – параметрический полиморфизм.
template <class Тype> class Stack {
Тype stack[100];
...
public:
void push (Тype);
Т рор ();
...
};
Префикс template < class Тype > делает Тype параметром объявления, которому этот префикс предшествует.
Инстанцирование – подстановка фактических параметров шаблона вместо формальных. В результате создается конкретный класс, который может иметь экземпляры.
Объявим нужные нам стеки:
typedef Stack < int > IntStack // синоним класса стеков целых чисел
typedef Stack < Controller* > ControllerStack // синоним класса стеков
// контроллеров
IntStack IS; // стек для целых чисел
ControllerStack CS; // стек для контроллеров
Объекты IS и CS – это экземпляры совершенно различных классов, которые даже не имеют общего суперкласса. Тем не менее они получены из одного параметризованного класса Stack.
Инстанцирование безопасно с точки зрения типов. По правилам C++ будет отвергнута любая попытка поместить в стек или извлечь из него что-либо, кроме целых чисел или указателей на экземпляры класса Controller, соответственно.
В языке С++ можно определять шаблоны не только классов, но и функций. В качестве примера рассмотрим определение шаблона функции, служащей для определения максимального из двух элементов.
template <class Тype > Тype max(Тype x, Тype y){
return (x > y)? x: y;
};
Теперь мы можем использовать один и тот же шаблон для целых и вещественных чисел.
int i, j, k;
double a, b, c;
...
k = max <int> (i, j);
c = max <double> (a, b);
Кроме того, возможно использовать этот шаблон и для объектов некоторого класса, если в нем определена операция ">".
Дата публикования: 2015-04-06; Прочитано: 319 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!