Содержание
-
Шаблони класів
-
Шаблон класу – схема побудови інших класів на основі цього шаблону. Шаблони дають змогу створити один опис класу, який можна використовувати для роботи з різними типами даних(vector, list…). Шаблони значно скорочують код програми, тому що достатньо написати один шаблонний клас, який зможе працювати з різними типами даних.
-
Синтаксис оголошення шаблонного класу
Оголошення шаблону починається зі слова template, яке вказує компілятору на те, що далі йде оголошення шаблону. Після template в вказуються шаблонні параметри В даному випадку ключове слово classне означає те, що T1 обов’язково має бути класом, T1 може бути простим типом даних (int, char…) Також замість слова клас можна використовувати слово typename Template class A {…} Після цього у описі класу можна використовувати T1, T2 так само як і звичайні типи даних.
-
Приклад шаблонного стеку
tempalte class Stack { private: enum {MAX = 10} Type items[MAX]; int top; public: Stack(); boolIsEmpty(); boolIsFull(); bool Push(const Type& item); //передаємо дані типу T для занесення в стек bool Pop(Type& item); }; …. //використання шаблонного класу Stack stack_int; Stack stack_string;
-
Реалізація методів шаблонного класу
Методи шаблонного класу стають шаблонними методами. Можуть бути як вбудованими (inline) так і реалізовані за межами класу. Синтаксис реалізації шаблонного методу: Template classNmae::methodName(parameters). Якщо метод реалізовується в класі, то синтаксис реалізації є таким самим як у методів звичайного класу.
-
Приклад реалізації
template Stack::IsEmpty() { return top == 0; } template bool Stack::IsFull() { return top == MAX; } template bool Stack::push(const Type& item) { if (top bool Stack::pop(Type& item) { if (top > 0) { item = items[--top]; return true; } else { return false; } }
-
Параметри за замовчуванням в шаблонах
Шаблонні класи можуть приймати параметри за замовчуванням (функції з параметрами за замовчуванням). Template class A {…} Якщо при створенні об’єкта класу А, другий параметр не буде вказаний, то компілятор буде підставляти замість T2 іnt. A a1 //T1 = double, T2 = double Aa2//T1 = double, T2 = int.
-
Спеціалізація шаблонів
Явна спеціалізація – це визначення конкретного типу, який має використовуватись замість загального шаблону. Явна спеціалізація шаблону використовується тоді, коли шаблонний клас має вести себе по-іншому для цього типу даних. Синтаксис оголошення спеціалізованого шаблону: Template class Ім’яКласу Template class A {…} //загальний клас Template class A {…}//спеціалізований клас.
-
Часткова спеціалізація шаблонів – використовується тоді, коли у шаблонному класі є декілька типів-параметрів(T1, T2) і клас має працювати по-іншому, якщо один з параметрів є деяким типом. Приклад template class A {…}//загальний шаблон template class A {…}//часткова спеціалізація Якщо у компілятора є вибір, то він приймає найбльш спеціалізований шаблон. Тобто якщо ви створюєте об’єкт класуз параметрами то клас буде генеруватись на основі загального шаблону, але якщо у вас другим параметром буде int, то буде використовувавитсь частково спеціалізований шаблон.
-
Рекурсивне використання шаблонів
Шаблон класу A, може виступати параметром для того ж класу А. Приклад: template class Array//шаблон масиву розміром n. Array a; // створення об’єкта типу Array. //Масив цілих чисел розміром 10. Array, 10> b; //масив з 10 елементів, кожен з яких //є масивом з 5 елементів.
-
Шаблони як члени класів
Шаблони можуть бути членами структури, класу чи іншого шаблону. Ця властивість шаблонів часто використовується в STL. Приклад template class beta { private: template // область видимості класу hold – клас beta. class hold { private: V val; public: hold(V v = 0) : val(v) {} void show() const {cout q; //об’єкти класу hold в класі beta. hod n; //... }
-
Шаблони як параметри
Шаблони можуть мати параметри, які також є шаблонами. Це також використовується для реалізації бібліотеки STL. Приклад template class Thing> Class A {…} Тут class Thing – параметр шаблону, при чому template class - тип, Thing – параметр. Для створення об’єкту класу А, йому потрібно передати параметр, який відповідає типу class T> class .
-
Шаблонні класи і друзі
Шаблонні класи можуть мати друзів як і звичайні класи. Друзі можуть бути шаблонними або простими функціями, шаблонними або простими класами. Дружні функції і класи можуть належати до одної з трьох груп: Нешаблонні друзі Зв’язні шаблонні друзі – тип друга визначається типом класу при створенні екземпляра. Незв’язні шаблонні друзі – всі спеціалізації друга є друзями для всіх спеціалізаційшаблонного класу.
-
Нешаблонні дружні функції template class HasFriend { public: // дружня фукнція для всіх екземплярів класу HasFriend friend void counts() friend void report(HasFriend&); зв’язний друг //.... //незв’язна дружня шаблонна функція, є дружньою для всіх екземплярів. template friend void show(C &, D &) } HasFriend //функція counts() є дружньою для цього класуHasFrined//і для цього тежHasFrined //ф-яreport(HasFriend&) дружня для цього класу HasFriend//ф-яreport(HasFriend&) дружня для цьогокласу report(..) – не є шаблонною функцією, вона лише приймає шаблонний параметр. Це означає, що потрібно створювати спеціалізації для параметраvoid report(HasFriend&) {..} void report(HasFrined&) {…}
-
Наслідування і шаблони
Шаблонні класи підтримують наслідування так само як і звичайні класи. Все що справедливо для звичайних класів працює і з шаблонними. Повноцінна підтримка шаблонами механізму наслідування дає можливість створювати навіть абстрактні шаблонні класи. Шаблонна функція шаблонного класу не може бути віртуальною, але звичайна шаблонна функція шаблонного класу може бути віртуальною.
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.