08 Templates

34
Бублик Володимир Васильович Програмування - 2 Лекція 8. Об'єктне програмування. Параметризовані класи Лекції для студентів 2 курсу

Transcript of 08 Templates

Page 1: 08 Templates

Бублик Володимир Васильович

Програмування - 2

Лекція 8. Об'єктне програмування.

Параметризовані класи

Лекції для студентів 2 курсу

Page 2: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

2

Повторення

• class DissimilarVector• {• private:• const size_t _n;• double * _v;• public:• explicit DissimilarVector(int);• ~DissimilarVector();• size_t size() const { return _n;}• double operator[](size_t) const;• double& operator[](size_t);• };

Page 3: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

3

Типізація векторів

• DissimilarVector u(10), v(100);• Об'єкти u і v мають один і той же тип

DissimilarVector• Розмірності векторів u і v визначені статично,

але їх типи не розрізняються• Як визначити додавання векторів u і v?• Як включити статичну розмірність до типу

вектора?

Вихід: Зробити тип вектора залежним від розмірності як параметру

Page 4: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

4

Параметризований вектор

• template <size_t size> // параметр• class Vector• {• private:• const size_t _n;• double _v [size];• public:• explicit Vector();• ~Vector();• double operator[](int i) const;• double& operator[](int i);• };

Page 5: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

5

Діаграми векторів

• Vector<10> v;• Vector<100> w;

Page 6: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

6

Порівняння типів векторів

Тип WrappedVector:• Всі вектори в програмі мають одну розмірність

― не можна оперувати векторами різних розмірностей

Тип DissimilarVector• Вектори одного типу мають довільну

розмірність ― неможливо виконувати статичний контрольтипів

Параметризований тип Vector• Тип вектора визначається його розмірністю

Page 7: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

7

Узагальнена операція

• // Скалярне множення параметризованих векторів

• template <size_t size>• double operator*• (const Vector<size>& u, const Vector<size>&

v)• {• double res=0;• for (int i=0;i<u.volume(); i++)• res += u[i]*v[i];• return res;• }

Page 8: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

8

Статичний контроль типів

• Vector<10> u1, u2;• Vector<100> v1, v2;

• // Конкретизація для Vector<10>• u1*u2;

• // Конкретизація для Vector<100>• v1*v2;

• // Синтаксична помилка• u1*v1;

Page 9: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

9

Заголовний файл (1)

• template <size_t size>• class Vector• {• private:• const size_t _n;• double _v [size];• public:• explicit Vector();• ~Vector();• double operator[](int i) const;• double& operator[](int i);

Page 10: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

10

Заголовний файл (2)

• Vector& operator=(const Vector&);• int volume() const { return _n; }• };

• template <size_t size>ostream& operator<<• (ostream&, const Vector<size>&);• template <size_t size> istream& operator>>• (istream&, Vector<size>&);• template <size_t size> bool operator==• (const Vector<size>&, const

Vector<size>&);

Page 11: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

11

Заголовний файл (3)

• template <int size> Vector<size>::Vector(): _n (size)• {• for (int i=0; i<_n; i++)• _v[i] = 0;• return;• }• template <int size>• Vector<size>::~Vector()• {• return;• }

Page 12: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

12

Заголовний файл (4)

• template <int size>• Vector<size>& Vector<size>::• operator=(const Vector<size>& vec)• {• if (this==&vec)• return *this;•• for (int i=0; i<_n; i++)• _v[i] = vec._v[i];• return *this;• }

Page 13: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

13

Заголовний файл (5)

• template <size_t size> ostream& operator<< • (ostream& os, const Vector<size>& u)• {• os<<‘['<<u.volume()<<‘]'<<endl<<‘(‘;• for (int i=0; i<u.volume(); i++)• {• os<<u[i]<<‘ ‘;• }• os<<')'<<endl;• return os;• }

Page 14: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

14

Моделі компіляції

Параметризовані класи (class templates) компілюються в особливий спосіб

• компіляція приєднанням (compilation by including)реалізація класу розміщується в заголовному файлі

• відокремлена компіляція (compilation by separation)реалізація експортується (розповсюдженими компіляторами поки що не підтримується) export class

Page 15: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

15

Компіляція

Компіляція параметризованого класу відбувається мірою визначення об'єктів і використання методів

• // Конкретизується клас Vector<10>• // Компілюються конструктор і деструктор• Vector<10> u;

• // Компілюється утиліта вводу• cin>>u;

Page 16: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

16

Компіляція

Для кожної нової конкретизації створюється власна реалізація

• // Конкретизується клас Vector<100>• // Компілюються його конструктор і

деструктор• Vector<100> v;

• // Компілюється утиліта вводу вектора Vector<100>

• cin>>v;

Page 17: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

17

Вправа

Спроектувати і реалізувати параметризований клас

• // Текстовий екран розміром• // height х width• //• template<int height, int width> • class Screen• {• public:• ……………………………………………………………………

………

Page 18: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

18

Діаграма класів

Page 19: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

19

Повторення. Різнотипні масиви

Фрагменти реалізації масивів елементів різних типів

Масив цілих чисел Масив символів Масив точок

// Масив елементів типу int

ArrayOfInt::ArrayOfInt (size_t sz): _size(sz), _pElem (new int[_size])

{return;

}

int&ArrayOfInt::operator[

] (size_t index){

return _pElem[index];

}

// Масив елементів типу char

ArrayOfChar::ArrayOfChar (size_t sz): _size(sz), _pElem (new char[_size])

{return;

}

char&ArrayOfChar::operator[

] (size_t index){

return _pElem[index];

}

// Масив елементів типу Point

ArrayOfPoint::ArrayOfPoint (size_t sz): _size(sz), _pElem (new Point[_size])

{return;

}

Point&ArrayOfPoint::operator[] (size_t index)

{return _pElem[index];

}

Page 20: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

20

Визначення типів

• #include “Point.h”• typedef Point Elem;

• class Array• {• private:• size_t _size;• Elem * _pElem;• ……………………….• };

Page 21: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

21

Визначення типів

• Перевага: програмний код не залежить від конкретного типу

• Недолік: В області видимості конкретного визначення типу typedef неможливо одночасно застосувати інший тип

Page 22: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

22

Параметризація типовим параметром

• // Типовий параметр• template<typename Elem>

• class Array• {• private:• size_t _size;• Elem * _pElem;• ……………………….• };

Page 23: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

23

Замовчувані значення типових параметрів

• // Типовий параметр• template<typename Elem = double>

• class Array• {• private:• size_t _size;• Elem * _pElem;• ……………………….• };

Page 24: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

24

Діаграми масивів

Page 25: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

25

Порівняння

Програмуємо і використовуємо три класи• ArrayOfInt AI(10);• ArrayOfChar AC(10);• ArrayOfPoint AP(10);

Програмуємо один клас і використовуємо скільки завгодно конкретизацій

• Array<> DAI(10);• Array<int> TAI(10);• Array<char> TAC(10);• Array<Point> TAP(10);

Page 26: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

26

Поліпараметризовані класи

Page 27: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

27

Масив з двома параметрами

• template <size_t size, typename Elem>• // Масив з size елементів типу Elem• class Array• {• public:• explicit Array ();• ~Array();• private:• size_t _size;• Elem _pElem[size];• };

Page 28: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

28

Реалізація

• template<size_t size, typename Elem>• Array<size, Elem>::Array ():_size(size)• {• #ifndef NDEBUG• cout<<"Array created ("<<_size<<')'<<endl;• #endif• return;• }

Page 29: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

29

Вкладені (параметризовані) типи

• template<typename Elem>• // Масив елементів типу Elem• class Array• {• public:• // Клас для обробки помилкових ситуацій• // теж залежить від параметру Elem,• // він вкладений, а тому теж

параметризований тип• class BadArray• ……………….

Page 30: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

30

Вкладені (параметризовані) типи

• template<size_t size, typename Elem>• // Масив елементів типу Elem• class Array• {• public:• // Клас для обробки помилкових ситуацій• // тепер залежить від двох параметрів size і

Elem ,• // він вкладений, а тому теж

параметризований тип• class BadArray• ……………….

Page 31: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

31

Діаграми вкладених типів

Page 32: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

32

Клонування вкладених типів

• catch (Array< 4, char>::BadArray x)• {• cerr<<"Non-existing symbol"<<endl;• cerr<<x;• }• catch (Array< 5, double>::BadArray x)• {• cerr<<"Non-existing real"<<endl;• cerr<<x;• }

Page 33: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

33

Реалізація вкладених типів

• template <size_t size, typename Type>• class Array< size, Type>::BadArray• {• private:• string _reason;• size_t _index;• public:• BadArray(string reason="", size_t index=0);• ~BadArray();• const string& getReason() const;• };

Page 34: 08 Templates

© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи

34

Висновки

Одне з найважливіших застосувань параметризованих типів ― узагальнене програмування контейнерів

STL стандартна бібліотека шаблонів (Standard Template Library)

Параметризовані контейнери (на практичних)• Послідовність• Список• Стек• Черга• Дек