Лабораторная работа №9-10

Тема: Шаблоны функций и классов. Генерация и обработка исключительных ситуаций.

Цель:

- познакомиться с шаблонами функций и классов;

- научиться создавать программы на С++ с использованием различных шаблонов;

- уметь генерировать и обрабатывать исключительные ситуации.

Краткая теория.

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

Принятый в Си++ способ определения множества классов с параметризованным внутренним типом данных (иначе, макроопределение) называется шаблоном (template). Синтаксис шаблона рассмотрим на примере шаблона класса векторов, содержащих динамический массив ссылок на переменные заданного типа.

--- параметр шаблона - класс "T", внутренний тип данных

¦ --- имя группы шаблонных классов

template <class T>

class vector {

int tsize; // Общее количество элеметов

int csize; // Текущее количество элементов

T **obj; //Массив ссылок на параметризованные объекты типа "T"

public:

T *operator[](int); // оператор [int] возвращает ссылку

// на параметризованный объект класса "T"

void insert(T*); // функция включения объекта типа "T"

int extract(T*); //

};

Данный шаблон может использоваться для порождения объектов-векторов, каждый из которых хранит объекты определенного типа. Имя класса при этом составляется из имени шаблона "vector" и имени типа данных (класса), который подставляется вместо параметра "Т":

vector<int> a;

vector<double> b;

extern class time;

vector<time> c;

Заметим, что транслятором при определении каждого вектора с новым типом объектов генерируется описание нового класса по заданному шаблону (естественно, неявно в процессе трансляции):

class vector<int> {

int tsize;

int csize;

int **obj;

public:

int *operator[](int);

void insert(int*);

int index(int*);

};

Далее следует очевидное утверждение, что элементыфункции шаблона также должны быть параметризованы, то есть генерироваться для каждого нового типа данных. Действительно, это так: элементы-функции шаблона классов в свою очередь также являются шаблонными функциями с тем же самым параметром. То же самое касается переопределяемых операторов:

--- параметр шаблона - класс "T", внутренний

¦ тип данных

¦--- имя элемента-функции или оператора

¦ ¦ - параметризовано

template <class T> T* vector<T>::operator[](int n) {

if (n >=tsize) return(NULL);

return (obj[n]);

}

template <class T> int vector<T>::index(T *pobj) {

int n;

for (n=0; n<tsize; n++)

if (pobj == obj[n]) return(n);

return(-1);

}

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

template < class T >
class Vector {
T * data;
int size;
public:
Vector(int);

~Vector() { delete data; }
T & operator[] ( int i ) { return data[i]; }
};
// определение конструктора вне описания шаблона класса
template < class T >
Vector < T > :: Vector ( int s )
{ data = new T [s];
size = s;
}

Практические задания:

Шаблоны

1. Написать функцию-шаблон сортировки массива по возрастанию. Метод сортировки - пузырьковая сортировка. Пузырьковая сортировка основана на методу перестановок. Ее смысл заключается в постоянном сравнении смежных элементов и при необходимости их перестановки.

Обработка исключительных ситуаций

1. Написать программу, в которой перехватываются исключения типа int, char *. Сгенерировать исключительную ситуацию.

2. Добавить к программе в задании 1 перехват любой исключительной ситуации.