Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_LAB_Part_2_Obyektno-orientov_progr.DOC
Скачиваний:
8
Добавлен:
03.05.2019
Размер:
418.3 Кб
Скачать

Лабораторна робота №6. Шаблони функцій і класів.

Мета. Одержати практичні навички створення шаблонів і використання їх у програмах С++ .

Основний зміст роботи.

Створити шаблон заданого класу і використовувати його для даних різних типів.

Короткі теоретичні відомості.

Шаблон функції.

Шаблон функції (інакше параметризована функція) визначає загальний набір операцій (алгоритм), що будуть застосовуватися до даних різних типів. При цьому тип даних, над якими функція повинна виконувати операції, передається їй у виді параметра на стадії компіляції.

У С++ параметризована функція створюється за допомогою ключового слова template. Формат шаблона функції:

template <class тип_даних> тип_поверн_значення ім'я_функції(список_параметрів){тіло_функції}

Основні властивості параметрів шаблона функції.

  • Імена параметрів шаблона повинні бути унікальними у всім визначенні шаблона.

  • Список параметрів шаблона не може бути порожнім.

  • У списку параметрів шаблона може бути кілька параметрів і кожному з них повинне передувати ключове слово class.

  • Ім'я параметра шаблона має усі права імені типу у визначеної шаблоном функції.

  • Визначена за допомогою шаблона функція може мати будь-яку кількість непараметризованих формальних параметрів. Може бути непараметризоване і значення, що повертається функцією.

  • У списку параметрів прототипу шаблона імена параметрів не зобов'язані збігатися з іменами тих же параметрів у визначенні шаблона.

  • При конкретизації параметризованої функції необхідно, щоб при виклику функції типи фактичних параметрів, що відповідають однаково параметризованим формальним параметрам, були однакові.

Шаблон класу.

Шаблон класу(інакше параметризований клас) використовується для побудови родового класу. Створюючи родовий клас, ви створюєте ціле сімейство родинних класів, які можна застосовувати до будь-якого типу даних. Таким чином, тип даних, яким оперує клас, указується як параметр при створенні об'єкта, що належить до цього класу. Подібно тому, як клас визначає правила побудови і формат окремих об'єктів, шаблон класу визначає спосіб побудови окремих класів. У визначенні класу, що входить у шаблон, ім'я класу є не ім'ям окремого класу, а параметризованим ім'ям сімейства класів.

Загальна форма оголошення параметризованого класу:

template <class тип_даних> class ім'я_класу { . . . };

Основні властивості шаблонів класів.

  • Компонентні функції параметризованого класу автоматично є параметризованими. Їх не обов'язково повідомляти як параметризовані за допомогою template.

  • Дружні функції, що описуються в параметризованому класі, не є автоматично параметризованими функціями, тобто за замовчуванням такі функції є дружніми для всіх класів, що організуються по даному шаблоні.

  • Якщо friend-функція містить у своєму описі параметр типу параметризованого класу, то для кожного створеного по даному шаблоні класу є власна friend-функція.

  • У рамках параметризованого класу не можна визначити friend-шаблони (дружні параметризовані класи).

  • З однієї сторони шаблони можуть бути похідними (успадковуватися) як від шаблонів, так і від звичайних класів, з іншого боку, вони можуть використовуватися в якості базових для інших шаблонів чи класів.

  • Шаблони функцій, які є членами класів, не можна описувати як virtual.

  • Локальні класи не можуть містити шаблони як свої елементи.

Компонентні функції параметризованих класів

Реалізація компонентної функції шаблона класу, що знаходиться поза визначенням шаблона класу, повинна включати додатково наступні два елементи:

  • Визначення повинне починатися з ключового слова template, за яким слідує такий же список_параметрів_типів у кутових дужках, який зазначений у визначенні шаблона класу.

  • За ім'ям_класу, що передує операції області видимості (::), повинний слідувати список_імен_параметрів шаблона.

template<список_типів>тип_поверн_значення ім'я_класу<список_імен_ параметрів> : : ім'я_функції(список_параметрів){ . . . }

Порядок виконання роботи.

1.Створити шаблон заданого класу. Визначити конструктори, деструктор, перевантажену операцію присвоювання (“=”) і операції, задані у варіанті завдання.

2.Написати програму тестування, у якій перевіряється використання шаблона для стандартних типів даних.

3.Виконати тестування.

4.Визначити клас користувача, що буде використовуватися як параметр шаблона. Визначити в класі необхідні функції і перевантажені операції.

5.Написати програму тестування, у якій перевіряється використання шаблона для типу користувача.

6.Виконати тестування.

Методичні вказівки.

1.Клас АТД реалізувати як динамічний масив. Для цього визначення класу повинне мати наступні поля:

- покажчик на початок масиву;

- максимальний розмір масиву;

- поточний розмір масиву.

2.Для вводу і виводу визначити в класі функції input і print.

3.Щоб у вас не виникало проблем, акуратно працюйте з константами об'єктами. Наприклад:

  • конструктор копіювання варто визначити так:

MyTmp (const MyTmp& ob);

  • операцію присвоювання перевантажити так:

MyTmp& operator = (const MyTmp& ob);

4.Для шаблонів множин, списків, стеків і черг як стандартні типи використовувати символьні, цілі і речовинні типи. Для типу користувача взяти клас з лабораторної роботи №1.

5.Для шаблонів масивів як стандартні типи використовувати цілі і дійсні типи. Для типу користувача взяти клас “комплексне число” complex.

class complex{

int re; // дійсна частина

int im; // мнима частина

public;

// необхідні функції і перевантажені операції

};

6.Реализацию шаблона варто розмістити разом з визначенням у заголовному файлі.

7.Програма створюється як EasyWin-додаток у Borland C++5.02.

8.Тестування повинне бути виконане для всіх типів даних і для всіх операцій.

Зміст звіту.

1.Титульний лист: назва дисципліни, номер і найменування роботи, прізвище, ім'я, по батькові студента, дата виконання.

2.Постановка задачі.

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

Те ж саме варто вказати для класу користувача.

3.Визначення шаблона класу з коментарями.

4.Визначення класу користувача з коментарями.

5.Реалізація конструкторів, деструктора, операції присвоювання й операцій, що задані у варіанті завдання.

6.Те ж саме для класу користувача.

7.Результати тестування. Варто вказати для яких типів і яких операцій перевірені і які виявлені помилки(чи не виявлені).

Питання для самоконтролю.

1.У чому зміст використання шаблонів?

2.Які синтаксис/семантика шаблонів функцій?

3.Які синтаксис/семантика шаблонів класів?

4.Напишіть параметризовану функцію сортування масиву методом обміну.

5.Визначте шаблон класу “вектор” - одномірний масив.

6.Що таке параметри шаблона функції?

7.Перелічіть основні властивості параметрів шаблона функції.

8.Як записувати параметр шаблона?

9.Чи можна перевантажувати параметризовані функції?

10.Перелічіть основні властивості параметризованих класів.

11.Чи може бути порожнім список параметрів шаблона? Поясніть.

12.Як викликати параметризовану функцію без параметрів?

13.Чи всі компонентні функції параметризованого класу є параметризованими?

14.Чи є дружні функції, описані в параметризованому класі, параметризованими?

15. Чи можуть шаблони класів містити віртуальні компонентні функції?

16.Як визначаються компонентні функції параметризованих класів поза визначенням шаблона класу?

Варіанти завдань.

1.Клас-одномірний масив. Додатково перевантажити наступні операції:

“*” - множення масивів;

“[]” - доступ за індексом;

2.Клас-одномірний масив. Додатково перевантажити наступні операції:

“int()” - розмір масиву;

“[]” - доступ за індексом;

3.Клас-одномірний масив. Додатково перевантажити наступні операції:

“[]” - доступ за індексом;

“==” - перевірка на рівність;

“!=” - перевірка на нерівність;

4.Клас-множина set. Додатково перевантажити наступні операції:

“+” - додати елемент у множину (типу set+item);

“+” - об'єднання множин.

“*” - перетинання множин;

5.Клас- множина set. Додатково перевантажити наступні операції:

“+” - додати елемент у множину (типу item + set);

“+” - об'єднання множин;

“==” - перевірка множин на рівність.

6.Клас-множина set. Додатково перевантажити наступні операції:

“-” - видалити елемент із множин (типу set-item);

“*” - перетинання множин;

“<” - порівняння множин .

7.Клас-множина set. Додатково перевантажити наступні операції:

“-” - видалити елемент із множини (типу set-item);

“>”- перевірка на підмножину;

“!=” - перевірка множин на нерівність.

8.Клас-множина set. Додатково перевантажити наступні операції:

“+” - додати елемент у множину (типу set+item);

“*” - перетинання множин;

“int()” - потужність множини.

9.Клас-множина set. Додатково перевантажити наступні операції:

“()” - конструктор множини (у стилі конструктора для множинного типу в мові Pascal);

“+” - об'єднання множин;

“<=” - порівняння множин .

10.Клас-множина set. Додатково перевантажити наступні операції:

“>” - перевірка на приналежність (типу операції in множинного типу в мові Pascal);

“*” - перетинання множин;

“<” - перевірка на підмножину.

11.Класс-однонаправлений список list. Додатково перевантажити наступні операції:

“+” - додати елемент у початок (list+item);

“--” - видалити елемент із початку (--list);

“==” - перевірка на рівність.

12.Класс-однонаправлений список list. Додатково перевантажити наступні операції:

“+” - додати елемент у початок (item+list);

“-і” - видалити елемент із початку ( -іlist);

“!=” - перевірка на нерівність.

13.Класс-однонаправлений список list. Додатково перевантажити наступні операції:

“+” - додати елемент у кінець (list+item);

“-і” - видалити елемент із кінця (типу list-і);

“!=” - перевірка на нерівність.

14.Класс-однонаправлений список list. Додатково перевантажити наступні операції:

“[]” - доступ до елемента в заданій позиції, наприклад:

Type c;

int i;

list L;

c=L[i];

“+” - об'єднати два списки;

“==” - перевірка на рівність.

15.Класс-однонаправлений список list. Додатково перевантажити наступні операції:

“[]” - доступ до елемента в заданій позиції, наприклад:

int i; Type c;

list L;

c=L[i];

“+” - об'єднати два списки;

“!=” перевірка на нерівність.

16.Класс-однонаправлений список list. Додатково перевантажити наступні операції:

“()” - видалити елемент у заданій позиції, наприклад :

int i;

list L;

L(i);

“()” - додати елемент у задану позицію, наприклад :

int i;

Type c;

list L;

L(c,i);

“!=” - перевірка на нерівність.

17.Клас-стек stack. Додатково перевантажити наступні операції:

“+” - додати елемент у стек;

“—“ - витягти елемент зі стека;

bool() - перевірка чи порожній стек?

18.Клас-черга queue. Додатково перевантажити наступні операції:

“+” - додати елемент ;

“—“ - витягти елемент ;

bool() - перевірка чи порожня черга?

19.Клас-одномірний масив. Додатково перевантажити наступні операції:

“+” - додавання масивів;

“[]” - доступ за індексом;

“+” - скласти елемент із масивом.

20.Клас-одномірний масив. Додатково перевантажити наступні операції:

“-” – віднімання масивів;

“[]” - доступ за індексом;

“-” - відняти з масиву елемент.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]