При включении шаблона класса в программу никакие классы на самом деле не генерируются до тех пор, пока не будет создан экземпляр шаблонного класса, в котором вместо абстрактного типа Т указывается некоторый конкретный тип.
Такая подстановка приводит к актуализации, или инстанцированию, шаблона. Как и для обычного класса, экземпляр создается либо объявлением объекта, например:
point<int> anyPoint(13, -5);
либо объявлением указателя на актуализированный шаблонный тип с присваиванием ему адреса, возвращаемого операцией new, например:
point<double>* pOtherPoint = new point<double>(9.99. 3.33);
Встретив подобные объявления, компилятор генерирует код соответствующего класса.
Еще один пример.
// шаблон векторов
template<class T> // Т – параметр шаблона
class Vector // Vector - имя семейства классов
{T* data; // данные класса
int size; // размер пространства
public:
Vector(int); // конструктор
~Vector () { delete [ ]data; } // деструктор
// перегрузка операции “ [ ]”
T& operator [ ] (int i) { return data[i];}
friend ostream & operator << (ostream&, Vector <T>);
};
template<class T> // внешнее определение конструктора шаблона
Vector <T>:: Vector(int n)
{data = new T[n];
size =n;}
// определение перегрузки операции <<
ostream & operator << (ostream& out, Vector <T> X)
{ out<<endl;
for(int i=0;i<X.size; i++)
out<<X[i]<<" "; return out;}
Теперь можно объявлять объекты конкретных классов, порожденных из шаблона:
имя параметризованного класса(шаблона)
< фактические параметры шаблона>
имя объекта (параметры конструктора);
т.е. имя конкретного класса будет:
имя параметризованного класса(шаблона)
< фактические параметры шаблона>
Vector<char> A(5); // вектор А – массив из пяти значений типа
//char, здесь Vector <char> - имя класса
int main()
{clrscr();
// статические объекты:
Vector<int> X(5);
Vector <char> C(5);
// динамический объект:
Vector<int>*p= new Vector<int> (10);
// заполнение элементов значениями и вывод элементов вектора,
// используя перегруженную операцию []
for(int j =0; j<10; j++)
{(*p)[j]= j; cout<< (*p)[j]<<" ";}
return;}
Достоинства и недостатки шаблонов
Шаблоны представляют собой мощное и эффективное средство обращения с различными типами данных, которое можно назвать параметрическим полиморфизмом, а также обеспечивают безопасное использование типов.
Однако следует иметь в виду, что программа, использующая шаблоны, содержит полный код для каждого порожденного типа, что может увеличить размер исполняемого файла.
Пример разработки шаблона класса.
Порядок выполнения работы
1. Отредактировать приложение, демонстрирующее работу с классом «Рациональное число», определив описание класса как шаблон.
2. Разработать шаблоны классов согласно варианту.
3. Создать приложение, демонстрирующее использование разработанного класса.
Варианты заданий:
1. Разработать класс «Комплексное число». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения комплексного числа из строки.
2. Разработать класс «Комплексное число в тригонометрической форме». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения комплексного числа из строки.
3. Разработать класс «Дата». Определить в нем конструкторы и деструктор, перегрузить операцию добавления к дате заданного количества дней, операцию вычитания двух дат, операции сравнения и операцию преобразования в символьную строку, а также статический метод получения даты из строки.
4. Разработать класс «Время». Определить в нем конструкторы и деструктор, перегрузить операцию добавления к времени заданного количества минут, операцию вычитания двух моментов времени, операцию преобразования в символьную строку и метод получения момента времени из строки.
5. Разработать класс «Прямоугольник». Определить в нем конструкторы и деструктор, перегрузить операцию пересечения прямоугольников (операция “*”), операцию вычисления площади прямоугольника, операции сравнения (по площади), операцию преобразования в символьную строку и метод получения объекта-прямоугольника из строки.
6. Разработать класс «Треугольник». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (площадь треугольника), операцию проверки включения точки в треугольник, операции сравнения треугольников (по площади), операцию преобразования в символьную строку и метод получения объекта-треугольника из строки.
7. Разработать класс «Круг». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (площадь круга), операцию проверки включения точки в круг, операции сравнения кругов (по радиусу), операцию преобразования в символьную строку и метод получения объекта-круга из строки.
8. Разработать класс «Отрезок». Определить в нем конструкторы и деструктор, перегрузить операцию преобразования в вещественное число (длина отрезка), операцию проверки параллельности отрезка осям координат, операции сравнения отрезков (по длине), операцию преобразования в символьную строку и метод получения объекта-отрезка из строки.
9. Разработать класс «Прямая». Определить в нем конструкторы и деструктор, перегрузить операцию сложения прямой с числом (смещение вдоль оси у: вверх или вниз), операцию умножения на число (изменение угла наклона), операцию проверки параллельности прямой осям координат, операцию преобразования в символьную строку и метод получения объекта-прямой из строки.
10. Разработать класс «Вектор». Определить в нем конструктор, перегрузить арифметические операции, операции сравнения, операцию преобразования в строку и статический метод получения вектора из строки.
4. Содержание отчёта
1. Название, цель работы
2. Протокол выполнения работысо всеми распечатками, скриншотами, комментариями и наблюдениями согласно разделу «Выполнение работы».
3. Ответы на контрольные вопросы.
Вопросы к защите
1. В чем смысл использования шаблонов?
2. Синтаксис/семантика шаблонов классов?
3. Перечислите основные свойства параметризованных классов.
4. Может ли быть пустым список параметров шаблона? Объясните.
5. Все ли компонентные функции параметризованного класса являются параметризованными?
6.Являются ли дружественные функции, описанные в параметризованном классе, параметризованными?
7. Могут ли шаблоны классов содержать виртуальные компонентные функции?
8. Как определяются компонентные функции параметризованных классов вне определения шаблона класса?
Приложение
Самостоятельная работа по лабораторной работе № 12
«Шаблоны классов»
Самостоятельная работа по теме занятия включает в себя:
- изучение теоретического материала лекционных занятий, учебной литературы, Интернет-ресурсов, раздела «Краткие сведения из теории» настоящего описания ЛР;
- выполнение практических заданий и решение задач
Задачи и практические задания
1. Определить шаблон класса “вектор” - одномерный массив.
2. Определить шаблон класса “матрица” - двумерный массив.