08 Templates
-
Upload
olegapster -
Category
Technology
-
view
504 -
download
0
Transcript of 08 Templates
Бублик Володимир Васильович
Програмування - 2
Лекція 8. Об'єктне програмування.
Параметризовані класи
Лекції для студентів 2 курсу
© Бублик В.В. Програмування-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);• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
3
Типізація векторів
• DissimilarVector u(10), v(100);• Об'єкти u і v мають один і той же тип
DissimilarVector• Розмірності векторів u і v визначені статично,
але їх типи не розрізняються• Як визначити додавання векторів u і v?• Як включити статичну розмірність до типу
вектора?
Вихід: Зробити тип вектора залежним від розмірності як параметру
© Бублик В.В. Програмування-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);• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
5
Діаграми векторів
• Vector<10> v;• Vector<100> w;
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
6
Порівняння типів векторів
Тип WrappedVector:• Всі вектори в програмі мають одну розмірність
― не можна оперувати векторами різних розмірностей
Тип DissimilarVector• Вектори одного типу мають довільну
розмірність ― неможливо виконувати статичний контрольтипів
Параметризований тип Vector• Тип вектора визначається його розмірністю
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
8
Статичний контроль типів
• Vector<10> u1, u2;• Vector<100> v1, v2;
• // Конкретизація для Vector<10>• u1*u2;
• // Конкретизація для Vector<100>• v1*v2;
• // Синтаксична помилка• u1*v1;
© Бублик В.В. Програмування-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);
© Бублик В.В. Програмування-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>&);
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
14
Моделі компіляції
Параметризовані класи (class templates) компілюються в особливий спосіб
• компіляція приєднанням (compilation by including)реалізація класу розміщується в заголовному файлі
• відокремлена компіляція (compilation by separation)реалізація експортується (розповсюдженими компіляторами поки що не підтримується) export class
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
15
Компіляція
Компіляція параметризованого класу відбувається мірою визначення об'єктів і використання методів
• // Конкретизується клас Vector<10>• // Компілюються конструктор і деструктор• Vector<10> u;
• // Компілюється утиліта вводу• cin>>u;
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
16
Компіляція
Для кожної нової конкретизації створюється власна реалізація
• // Конкретизується клас Vector<100>• // Компілюються його конструктор і
деструктор• Vector<100> v;
• // Компілюється утиліта вводу вектора Vector<100>
• cin>>v;
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
17
Вправа
Спроектувати і реалізувати параметризований клас
• // Текстовий екран розміром• // height х width• //• template<int height, int width> • class Screen• {• public:• ……………………………………………………………………
………
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
18
Діаграма класів
© Бублик В.В. Програмування-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];
}
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
20
Визначення типів
• #include “Point.h”• typedef Point Elem;
• class Array• {• private:• size_t _size;• Elem * _pElem;• ……………………….• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
21
Визначення типів
• Перевага: програмний код не залежить від конкретного типу
• Недолік: В області видимості конкретного визначення типу typedef неможливо одночасно застосувати інший тип
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
22
Параметризація типовим параметром
• // Типовий параметр• template<typename Elem>
• class Array• {• private:• size_t _size;• Elem * _pElem;• ……………………….• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
23
Замовчувані значення типових параметрів
• // Типовий параметр• template<typename Elem = double>
• class Array• {• private:• size_t _size;• Elem * _pElem;• ……………………….• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
24
Діаграми масивів
© Бублик В.В. Програмування-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);
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
26
Поліпараметризовані класи
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
27
Масив з двома параметрами
• template <size_t size, typename Elem>• // Масив з size елементів типу Elem• class Array• {• public:• explicit Array ();• ~Array();• private:• size_t _size;• Elem _pElem[size];• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
28
Реалізація
• template<size_t size, typename Elem>• Array<size, Elem>::Array ():_size(size)• {• #ifndef NDEBUG• cout<<"Array created ("<<_size<<')'<<endl;• #endif• return;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
29
Вкладені (параметризовані) типи
• template<typename Elem>• // Масив елементів типу Elem• class Array• {• public:• // Клас для обробки помилкових ситуацій• // теж залежить від параметру Elem,• // він вкладений, а тому теж
параметризований тип• class BadArray• ……………….
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
30
Вкладені (параметризовані) типи
• template<size_t size, typename Elem>• // Масив елементів типу Elem• class Array• {• public:• // Клас для обробки помилкових ситуацій• // тепер залежить від двох параметрів size і
Elem ,• // він вкладений, а тому теж
параметризований тип• class BadArray• ……………….
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
31
Діаграми вкладених типів
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Параметризовані класи
34
Висновки
Одне з найважливіших застосувань параметризованих типів ― узагальнене програмування контейнерів
STL стандартна бібліотека шаблонів (Standard Template Library)
Параметризовані контейнери (на практичних)• Послідовність• Список• Стек• Черга• Дек