Загрузка...

Использование шаблонов.


Одной из важнейших возможностей С++ является шаблон (template). Это связанно с тем, что шаблоны фундаментально изменяют внешнюю сторону программирования. Используя шаблон можно создавать обобщенные спецификации для ф-ий и для классов, которые часто называются параметризованными ф-ями и параметризованными классами.
Параметр. ф-я определяет общую процедуру, кот-я может быть применена к данным различных типов.
Параметр. класс определяет общий класс, который может применяться к изменяющимся типам данных.
В обоих случаях конкретный тип данных, под которым выполняется операция, передается в качестве параметров.
Шаблон класса используется для построения произвольного класса. Создавая родовой класс мы создаем также семейство родственных классов, кот-е можно применять к любому типу данных.
Наиболее широкое применение шаблоны классов находят для построения контейнерных классов.
Контейнерным классом в общем случае наз-ся классы, в которых хранятся организованные данные.
Преимущество, даваемое определением параметризованных контейнерных классов заключается в том, что как только логика, необходимая для поддержки контейнера определена, он может применяться к любым типам данных без его перезаписывания.
Общая форма декларации контейнеризированного класса выглядит следующим образом:
Templeate<class Ttype> class
Class_name {…};
Здесь Ttype представляет собой имя типа шаблона, который в каждом случае конкретизации будет заменяться фактическим типом данных.
При необходимости можно определить более одного параметризованного типа данных используя список, с разделителем в виде (,). В пределах определения класса имя Ttype можно использовать в любом месте. Создав параметризованный класс можно создать конкретную реализацию этого класса, используя следующую форму:
Class_name <type> ob;
Здесь type, представляет собой имя типа данных, над которым фактически оперирует класс и заменяет собой переменную Ttype.
Ф-ии члены, параметризованного класса, автоматически являются параметризованными.
Разберем пример простого родового класса, реализующего односвязный список.Затем продемонстрируем возможности такого класса, путем создания связного списка для хранения символов.
template <class data_t> class list{
data_t data;
list *next;
public:
list (data_t, d);
void add(list *node){
node->next=this;
next=0;}
list getnext(){
return next;}
data_t getdata(){
return data;}
}
template <class data_t> ::list(data_td){
data_t data=d; //?data=d;
next=0;}
int main() {
list <char> start(‘a’);
list<char> *p, *last;
int i; //сождание списка
last =&start;
for(i=1;i<26;i++){
p=new list<char> (‘a’+i);
p->add(last);
last=p;
}
//вывод списка
p=&start;
while(p){
cout <<p->getdata();
p=p->getnext();}
return 0;
}
Тип данных, хранящихся в списке ставится родовым в объявлении класса, но он не проявляется, пока не объявлен объект, который и задает реальный тип данных.
В разобранном примере объекты и указатели создаются внутри ф-ии main(), где указывается, что типом хранящихся в списке данных является тип char. Путем простого изменения типа данных, кот-й указывается при создании объектов можно изменять тип данных, хранящихся в списке. Например с помощью следующего объекта можно создать другой объект, где можно было бы хранить целые.
List <int> int_start(1);

Загрузка...