View
42
Download
0
Category
Preview:
Citation preview
Модуль 4: Дополнительные темы объектно-ориентированного программирования.
Темы лекции: Шаблоны типов.
Практическое задание: Шаблоны типов.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 14
http://www.slideshare.net/IgorShkulipa 2
Обобщенное программирование
Обобщенное программирование – это парадигмапрограммирования, заключающаяся в создании алгоритмов,которые можно применять к различным типам данных
Различные типы данных часто требуется обрабатывать припомощи одних и тех же алгоритмов:
⚫Сортировка и поиск
⚫Контейнеры для произвольного типа элементов
⚫Программирование на основе стратегий
http://www.slideshare.net/IgorShkulipa 3
Шаблоны типов
Шаблон - это предписание для создания класса, в котором одинили несколько типов либо значений параметризированы.
Подобно тому, как класс является схемой для создания своихпредставителей-объектов, шаблон класса в C++ являетсясхемой для образования конкретных представителей-классовшаблона, или шаблонных классов.
Шаблоны классов называют иногда параметризованными типами,поскольку действительный класс создается посредствомспецификации конкретных параметров шаблона.
http://www.slideshare.net/IgorShkulipa 4
Общий вид задания шаблонов
Подобно шаблонам функций (лекция 3), для задания параметровкласса используется ключевое слово template
template<class Тype>
Тype sum(Тype а, Тype b)
В качестве параметров шаблона могут служить не только типы,но так же и параметры базовых или пользовательских типов.Общий вид объявления шаблона:
template <<class или тип> параметр, ...>
template<class Type1>
template<class Type1, class Type2>
template<class Type1, int size>
template<class Type<double>, int param>
http://www.slideshare.net/IgorShkulipa 5
Пример. Класс «Стек»template <class Type>
struct StackItem
{
Type value;
StackItem* Next;
StackItem* Prev;
};
template <class Type>
class Stack
{
public:
Stack();
~Stack();
Type pop();
void push(Type);
private:
StackItem<Type> *_stack;
};
http://www.slideshare.net/IgorShkulipa 6
Создание экземпляра параметризованного класса
При создании объекта параметризованного класса, необходимоуказать конкретные типы, которые будут использованы длясоздания этого объекта.
#include <string>
#include “stack.h”
using namespace std;
void main()
{
Stack<double> stack1;
Stack<int> stack2;
Stack<string> stack3;
Stack<StackItem<char>> stack4;
Stack<Stack<StackItem<double>>> stack5;
}
http://www.slideshare.net/IgorShkulipa 7
Параметры шаблонов, не являющиеся типами
В качестве параметров шаблонов могут выступатьне только типы данных, но так же:
1. Объекты перечислимого типа
⚫Целые типы
⚫Перечислимые типы
⚫ Тип bool
2. Указатели на объект или указатель на функцию
3. Ссылки на объект или ссылка на функцию
4. Указатели на методы класса
http://www.slideshare.net/IgorShkulipa 8
Пример. Класс «Массив фиксированной длины»
template <class Type, int size>
class TemplateArray {
public:
TemplateArray()
{
_data=new Type[size];
for (int i=0;i<size;i++)
{
_data[i]=rand();
}
}
private: Type* _data;
};
void main()
{
TemplateArray<double, 10> da10;
TemplateArray<float, 15> fa15;
TemplateArray<int, 12> ia12;
}
http://www.slideshare.net/IgorShkulipa 9
Использование шаблонов классов с шаблонами функций
В любом классе (в том числе и шаблонном) можно объявить метод-шаблон.
Пример:
template <class Type1, int size1>
class TemplateArray {
public: /*...*/
template <class Type2, int size2>
TemplateArray<Type1, size1>& operator=(TemplateArray<Type2, size2> &
anotherArray)
{
int minSize = (size1 < size2) ? size1 : size2;
for (int i = 0; i < minSize; i++)
{ _data[i] = anotherArray[i]; }
// заполняем остаток массива значениями по умолчанию
for (int i = size2; i < size1; i++)
{ _data[i] = Type1(); }
return *this;
}
private: Type1* _data;
}
void main()
{
TemplateArray<double, 9> doubleArray;
TemplateArray<int, 7> intArray;
doubleArray = intArray;
}
http://www.slideshare.net/IgorShkulipa 10
Использование шаблонов при наследовании
Ограничений на использование шаблонов при наследовании нет:
◦ Шаблон унаследован от простого класса
◦ Простой класс унаследован от шаблона
◦ Шаблон унаследован от шаблона
С помощью шаблонов можно создавать полные или частичныереализации некоторых интерфейсов. В этом случае шаблонныйпараметр выступает в качестве родительского класса.
Сам шаблонный класс при этом используется как основа длясоздания конкретных классов.
http://www.slideshare.net/IgorShkulipa 11
Преимущества и недостатки использования шаблонов
Преимущества:
◦ Повторное использование кода.
◦ Меньше ручной работы.
◦ Обобщенные контейнеры и алгоритмы.
◦ Возможность использования шаблонных реализаций интерфейсовпри построении иерархий наследования.
Недостатки:
◦ Раздувание бинарного кода. При использовании шаблонныхфункций и классов компилятор генерирует код на этапе компиляциидля всех использованных с данным шаблоном типов данных.
◦ Увеличение времени компиляции.
◦ Не все распространенные компиляторы поддерживают шаблоны вполной мере.
◦ Код, содержащий шаблоны сложнее анализировать.
◦ Сложность анализа сообщений компилятора об ошибкахкомпиляции.
http://www.slideshare.net/IgorShkulipa 12
Лабораторная работа №14. Шаблоны типов
Реализовать класс «Матрица» с использованиемпараметрических типов. Переопределить операторы.Реализовать меню для управления вычислениями.
Recommended