Шаблони

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2015
Тип роботи:
Лабораторна робота
Предмет:
Об’єктно-орієнтоване програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки Національний університет “Львівська політехніка” Кафедра ЕОМ / Звіт з лабораторної роботи № 9 з дисципліни: “Об’єктно-орієнтоване програмування” на тему: “Шаблони” Мета лабораторної роботи Познайомитися із створенням шаблонів. Теоретичні відомості Параметризовані функції Для виконання схожих операцій над різними типами даних часто використовуються перевантажені функції. Якщо ж для кожного типу даних повинні виконуватися ідентичні операції, то більш компактним і зручним рішенням є використання параметризованих (шаблонних) функцій. При цьому програміст повинен написати лише один опис шаблона функції. Базуючись на типах аргументів, використаних при виклику цієї функції, компілятор буде автоматично генерувати об'єктні коди функцій, що оброблятимуть кожен тип даних. Параметризовані функції декларуються за допомогою ключового слова template. Це слово використовується для створення шаблону (каркасу), що в загальних рисах описує призначення функції та надає опис операцій – сутність алгоритму, що може застосовуватися до даних різних типів. Загальна форма функції-шаблону матиме вигляд: temрlate <class T1, class T2, …, class Tn> тип ім'яФункції (параметри) {     // тіло функції }  За ключовим словом template слідує не порожній список параметрів шаблону, який складається з ідентифікаторів T, кожному з яких передує ключове слово class. Коли компілятор створюватиме конкретну версію функції, то автоматично замінить параметри конкретними типами даних. Цей процес носить назву інстанціювання шаблону. Кожен формальний параметр з опису шаблона функції повинен з'явитися в списку параметрів функції принаймні один раз. Ім'я формального параметра може використовуватися в списку параметрів заголовка шаблона тільки один раз. Те ж ім'я формального параметра шаблона функції може використовуватися декількома шаблонами. Шаблон функції може бути перевантажений, а саме можна визначити інші шаблони, що мають те ж ім'я функції, але різні набори параметрів. А можна ввести не шаблонну функцію з тим же ім'ям та іншим набором параметрів функції. Компілятор виконує процес узгодження, щоб визначити, який екземпляр функції відповідає конкретному викликові. Спочатку компілятор намагається знайти і використати функцію, що точно відповідає по імені та типам параметрів функції, що викликається. Якщо на цьому етапі компілятор зазнає невдачі, то він шукає шаблон функції, за допомогою якого він може згенерувати параметризовану функцію з точною відповідністю типів параметрів та імені функції; автоматичне перетворення типів не забезпечується. І як останню спробу, компілятор послідовно виконує процес підбору перевантаженої функції. Параметризовані класи Визначаючи параметризований клас, ми створюємо його каркас (шаблон), що описує усі алгоритми, які використовуються класом. Фактичний тип даних, над яким проводитимуться маніпуляції, буде вказаний в якості параметру при конкретизації об'єктів цього класу. Компілятор автоматично згенерує відповідний об'єкт на основі вказаного типу. Загальна форма декларування параметризованого класу буде такою: template < списокПараметрівШаблону > class ім’яКласу { // протокольна частина класу }  Список параметрів шаблону може містити елементи двох видів: специфікації формальних констант, що складаються з імені деякого типу з наступним ідентифікатором; специфікації формальних типів, що складаються з ключового слова class, за яким слідує ідентифікатор; вони аналогічні параметрам шаблона функції. Визначення функцій-елементів, розташованих в тілі шаблона, нічим не відрізняються від визначення вбудованих функцій-елементів звичайного класу. Визначення функцій-елементів, розташовуваних поза тілом шаблона, має наступний вид: template < списокПараметрівШаблону > тип ім'яКласу <параметриШаблону>:: імяФункції (параметри) {…}  Щоб створити із шаблона екземпляр конкретного класу, потрібно оголосити об'єкт, вказавши для його типу ім'я шаблона з набором конкретних аргументів (типів і констант). Кожен формальний тип у списку параметрів шаблона потрібно замінити на ім'я конкретного типу. Кожна формальна константа заміняється на константу зазначеного в шаблоні типу. Після того, як представник шаблонного класу створений, з ним можна поводитись як і з будь-яким об'єктом, що належить до звичайного класу. Коли при обробці вихідного файлу компіляторові зустрічається створення об'єкта на основі деякого шаблона класу, він насамперед генерує представника шаблона, або шаблонний клас. Власне кажучи при цьому генеруються і компілюються коди усіх функцій-елементів шаблона для даного набору його аргументів (і коди деяких допоміжних функцій). Після цього компілятор може конструювати об'єкт шаблонного класу, викликати потрібні функції-елементи об'єкта і т.д.. Якщо створюється шаблонний об'єкт, аргументи якого збігаються з аргументами об'єкта, раніше створеного в поточному модулі компіляції, то новий представник шаблона не генерується. Даний шаблонний клас вже існує, залишається тільки сконструювати об'єкт. Подібно до шаблонних функції, шаблон класу можна перевизначити для якогось конкретного типу аргументу. Це значить, що після визначення загального шаблона можна визначити спеціалізований шаблон класу і передбачити перевизначення всіх його елементів-функцій і статичних елементів даних. Загалом, повне перевизначення шаблона доцільно тоді, коли необхідна спеціалізація більшості його елементів-функцій. В іншому випадку достатньо написати явні реалізації необхідних методів шаблона для конкретних типів. Для шаблона класу можна визначити шаблон дружньої функції. Такий шаблон буде породжувати окрему дружню функцію для кожного шаблонного класу, що буде генеруватися. Типовим прикладом шаблона дружньої функції може служити операція передачі об'єкта в потік. Індивідуальне завдання Контейнерний клас описує та забезпечує набір дій над даними параметризованого масиву, розмірність якого визначається під час роботи програми. Усі обчислення та перетворення повинні бути реалізовані у вигляді функцій-членів класу. Варіант 4 В одновимірному масиві елементів, обчислити: – суму модулів елементів, які розташовані після першого додатного елемента. Код програми Stack.h template <typename Type> class Stack { private: Type *arr; int i, size; public: Stack(int size) { this->size = size; arr = new Type[size]; } ~Stack() { delete[] arr; } void set(Type value) { arr[i++] = value; } Type get(int i) { return arr[i]; } Type sum() { i = 0; Type result = 0; while (arr[i] <= 0) i++; for (i++; i < size; i++) { result += abs(arr[i]); } return result; } }; main.cpp #include <iostream> #include <conio.h> #include <time.h> #include "Stack.h" using namespace std; void main() { setlocale(LC_ALL, ""); srand(time(NULL)); int n; cout << "Введiть розмiрнiсть масиву:" << endl; cin >> n; cout << endl << "int:" << endl; Stack <int> ArrInt(n); for (int i = 0; i < n; i++) { ArrInt.set(rand() % 100 - 50); cout << ArrInt.get(i) << " "; } cout << endl << "Сума модулiв чисел пiсля першого додатного числа: " << ArrInt.sum() << endl << endl << "float:" << endl; Stack <float> ArrFloat(n); for (int i = 0; i < n; i++) { ArrFloat.set(round((float(rand() % 100 - 50) + float(rand()) / RAND_MAX) * 100) / 100); cout << ArrFloat.get(i) << " "; } cout << endl << "Сума модулiв чисел пiсля першого додатного числа: " << ArrFloat.sum() << endl; _getch(); } Результат виконання програми / Висновок Я познайомився із створенням шаблонів в мові C++ та написав програму, в роботі якої використовуються шаблони.
Антиботан аватар за замовчуванням

27.03.2016 19:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!