Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР3_ООП.doc
Скачиваний:
0
Добавлен:
14.11.2019
Размер:
172.54 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ЛЬВІВСЬКА ПОЛІТЕХНІКА

ОБ’ЄКТНО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ

МЕТОДИЧНІ ВКАЗІВКИ

до виконання лабораторної роботи

на тему:

“Шаблони класів. Обробка виняткових ситуацій”

для студентів базового напряму 6.050101 “Комп’ютерні науки”

Затверджено

на засіданні кафедри загальної екології

та екоінформаційних систем

Протокол № 13 від 24.05.2012 р.

Львів – 2012

Об’єктно-орієнтоване програмування: Методичні вказівки до виконання лабораторної роботи на тему “Шаблони класів. Обробка виняткових ситуацій” для студентів базового напряму 6.050101 “Комп’ютерні науки” / Укл.: І. Я. Казимира, О. Н. Кузь. – Львів: Видавництво Національного університету “Львівська політехніка”, 2012. – 23с.

Укладачі: Казимира І. Я., к.т.н., доц.

Кузь О. Н., асист.

Відповідальний за випуск: Заяць В. М., д.т.н., проф.

Рецензенти: Яцимірський М. М., д.т.н., проф.,

Фармага І. В., к.т.н., доц.

Вимоги до виконання лабораторної роботи

Кожен студент отримує індивідуальне завдання на лабораторну роботу (варіанти завдань відповідають номеру студента у журналі академічної групи).

Звіт про виконання індивідуального завдання лабораторної роботи обов’язково повинен містити такі пункти:

  1. Титульна сторінка встановленого зразка

  2. Формулювання завдання відповідного варіанту

  3. Опис розробки (опис класів відповідно до завдання, пояснення розроблених конструкторів, деструкторів, інших методів, відношень між класами, способів перевантаження операцій, тощо).

  4. Текст програми (з обов’язковими коментарями, що пояснюють хід виконання завдання).

  5. Протокол виконання програми

  6. Висновки

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

ЗРАЗОК ТИТУЛЬНОЇ СТОРІНКИ

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”

Інститут екології, природоохоронної діяльності та туризму ім. В. Чорновола

Кафедра загальної екології та

екоінформаційних систем

Лабораторна робота

з дисципліни Об’єктно-орієнтоване програмування

на тему:

Шаблони класів. Обробка виняткових ситуацій

Варіант 1

Виконав:

студент групи КН-28

Петренко А.А.

Перевірив:

ас. Кузь О.Н.

Львів – 2012

Шаблони класів

Шаблон класу – це узагальнене визначення класу, яке містить типи даних в якості параметрів, з якого компілятор автоматично створює клас для заданих користувачем типів даних. Коли компілятор створює по шаблону класу конкретний клас для визначених користувачем типом даних, то кажуть, що він створив породжений клас. У зв’язку з цим шаблон класу називають іноді родовим класом. Синтаксис оголошення шаблону класу має наступний вигляд:

template<class T1|T1 ідент1,

class T2|T2 ідент2,

class Tn|Tn ідентn>

class ім’я_класу

{

//Тіло класу

}

За ключовим словом template йде один або декілька параметрів в кутових дужках і розділених між собою комами. Кожний параметр є:

  • або ключовим словом class, за яким йде ім’я типу;

  • або ім’ям типу, за яким йде ідентифікатор.

Після цього йде оголошення класу. Оголошення та ініціалізація класу використовують список параметрів шаблону. Для задання параметризованих типів даних замість ключового слова class в кутових дужках може також використовуватись ключове слово typename. Як і у випадку шаблонних функцій, ключове слово class або typename показує, що параметр задає або вбудований, або визначений користувачем тип даних. Параметри шаблону, які йдуть за ключовим словом class або typename, називають параметризованими типами. Параметри шаблону, які складаються з імені типу і наступного за ним ідентифікатора, інформують компілятор про те, що параметром шаблону є константа вказаного типу. У зв’язку з цим параметри називаються нетиповими. Ім’я формального параметра у списку параметрів шаблону класу повинно бути унікальним. Функції-члени шаблону класу можуть визначатись в тілі класу (тобто як вбудовані) або поза тілом класу. В останньому випадку її визначення має вигляд:

template<class T1|T1 ідент1,

class T2|T2 ідент2,

class Tn|Tn ідентn>

поверт_тип

ім’я_класу<T1| ідент1, T2| ідент2,

Tn|ідентn>

::ім’я_функції (список параметрів)

{

//Тіло функції

}

Таким чином, список параметризованих типів і нетипових констант вказується двічі. Перший раз – після ключового слова template, він вказується точно так само, як при оголошенні шаблону. Другий раз – після імені класу – він вказується знову в кутових дужках, але на цей раз перераховуються лише параметризовані типи і нетипові константи.

У всьому решта визначення функції-члену не відрізняються від звичайного. Якщо необхідно оголосити функцію-член статичною або вбудованою, то модифікатор вказується за списком параметризованих типів і нетипових констант перед типом функції, який повертається. Наприклад:

template<class T>

inline void className<T>::funcName(int i)

{

//Тіло функції

}

Розглянемо приклади визначення шаблонів класів:

template<int size>

class TmplClass

{

char* s;

public:

TmplClass() {s=new char[size];}

~TmplClass() {delete[] s;}

operator char*() {return s;}

};

template<class T, int nElem>

class MyClass

{

T* p;

public:

MyClass();

~MyClass();

operator T*();

};

template<class T, int nElem>

MyClass<T, nElem>::MyClass()

{

p=new T[nElem];

}

template<class T, int nElem>

MyClass<T, nElem>::~MyClass()

{

delete[] p;

}

template<class T, int nElem>

MyClass<T, nElem>::operator T*()

{

return p;

}

Неможливо визначити внутрішній шаблонний клас в тілі іншого шаблонного класу, але ніщо не заважає вам використовувати раніше оголошений шаблонний клас при оголошенні і визначенні іншого. Розглянемо в якості прикладу визначення класу для узагальненого зв’язного списку, який призначений для роботи з визначеним користувачем типом даних:

//Визначення шаблонного класу вузла списку

template<class T>

class Node

{

Node<T>* Prev;

Node<T>* Next;

T* Item;

public:

Node(Node<T>*, Node<T>*, T*);

~Node();

};

template<class T>

Node<T>::Node(Node<T>* prev,

Node<T>* next, T* item)

{

Prev=prev;

Next=next;

Item=item;

}

template<class T>

Node<T>::~Node()

{

delete Item;

}

//Визначення шаблонного класу зв’язного списку,

//який використовує попередній шаблонний клас

template<class T>

class List

{

Node<T>* Head;

Node<T>* Item;

Node<T>* Tail;

public:

List();

~List();

void Add(T*);

void Remove();

};

template<class T>

List<T>::List()

{

Head=Item=Tail=0;

}

template<class T>

List<T>::~List()

{

//Видалення всіх елементів списку

Item=Head;

while(Item)

{

Remove();

Item++;

}

}

template<class T>

void List<T>::Add(T* item)

{

if(!Head)

{

//Створення першого елементу

Head=Tail=Item=new Node<T>(0,0, item);

}

else

{

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

}

}

template<class T>

void List<T>::Remove()

{

//Від’єднання вузла від списку

//видалення поточного вузла

delete Item;

}

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

template <class Т>

class List

{

Node<T>* Head;

Node<T>* Item;

Node<T>* Tail;

public:

List();

~List();

void Add(T*);

void Remove();

friend class FCIass<S>;

};

template <class S>

class FCIass

{

//Оголошення дружнього шаблонного класу

};

Тепер будь-який породжений клас типу FClass<S> буде дружнім для класу типу List<T>.