12
Модуль 4 : Дополнительные темы объектно-ориентированного программирования. Темы лекции : Шаблоны типов. Практическое задание : Шаблоны типов. Тренер: Игорь Шкулипа, к.т.н. C++ Базовый. Занятие 14

C++ Базовый. Занятие 14

Embed Size (px)

Citation preview

Page 1: C++ Базовый. Занятие 14

Модуль 4: Дополнительные темы объектно-ориентированного программирования.

Темы лекции: Шаблоны типов.

Практическое задание: Шаблоны типов.

Тренер: Игорь Шкулипа, к.т.н.

C++ Базовый. Занятие 14

Page 2: C++ Базовый. Занятие 14

http://www.slideshare.net/IgorShkulipa 2

Обобщенное программирование

Обобщенное программирование – это парадигмапрограммирования, заключающаяся в создании алгоритмов,которые можно применять к различным типам данных

Различные типы данных часто требуется обрабатывать припомощи одних и тех же алгоритмов:

⚫Сортировка и поиск

⚫Контейнеры для произвольного типа элементов

⚫Программирование на основе стратегий

Page 3: C++ Базовый. Занятие 14

http://www.slideshare.net/IgorShkulipa 3

Шаблоны типов

Шаблон - это предписание для создания класса, в котором одинили несколько типов либо значений параметризированы.

Подобно тому, как класс является схемой для создания своихпредставителей-объектов, шаблон класса в C++ являетсясхемой для образования конкретных представителей-классовшаблона, или шаблонных классов.

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

Page 4: C++ Базовый. Занятие 14

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>

Page 5: C++ Базовый. Занятие 14

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;

};

Page 6: C++ Базовый. Занятие 14

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;

}

Page 7: C++ Базовый. Занятие 14

http://www.slideshare.net/IgorShkulipa 7

Параметры шаблонов, не являющиеся типами

В качестве параметров шаблонов могут выступатьне только типы данных, но так же:

1. Объекты перечислимого типа

⚫Целые типы

⚫Перечислимые типы

⚫ Тип bool

2. Указатели на объект или указатель на функцию

3. Ссылки на объект или ссылка на функцию

4. Указатели на методы класса

Page 8: C++ Базовый. Занятие 14

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;

}

Page 9: C++ Базовый. Занятие 14

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;

}

Page 10: C++ Базовый. Занятие 14

http://www.slideshare.net/IgorShkulipa 10

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

Ограничений на использование шаблонов при наследовании нет:

◦ Шаблон унаследован от простого класса

◦ Простой класс унаследован от шаблона

◦ Шаблон унаследован от шаблона

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

Сам шаблонный класс при этом используется как основа длясоздания конкретных классов.

Page 11: C++ Базовый. Занятие 14

http://www.slideshare.net/IgorShkulipa 11

Преимущества и недостатки использования шаблонов

Преимущества:

◦ Повторное использование кода.

◦ Меньше ручной работы.

◦ Обобщенные контейнеры и алгоритмы.

◦ Возможность использования шаблонных реализаций интерфейсовпри построении иерархий наследования.

Недостатки:

◦ Раздувание бинарного кода. При использовании шаблонныхфункций и классов компилятор генерирует код на этапе компиляциидля всех использованных с данным шаблоном типов данных.

◦ Увеличение времени компиляции.

◦ Не все распространенные компиляторы поддерживают шаблоны вполной мере.

◦ Код, содержащий шаблоны сложнее анализировать.

◦ Сложность анализа сообщений компилятора об ошибкахкомпиляции.

Page 12: C++ Базовый. Занятие 14

http://www.slideshare.net/IgorShkulipa 12

Лабораторная работа №14. Шаблоны типов

Реализовать класс «Матрица» с использованиемпараметрических типов. Переопределить операторы.Реализовать меню для управления вычислениями.