Class monstr

{

int health, ammo;

color skin;

char *name;

 

public:

monstr(int he = 100, int am =10);

monstr(color sk);

monstr(char * nam);

int get_health(){return health;}

int get_ammo(){return ammo;}

};

// ----------------------------------------------

monstr::monstr(int he, int am)

{

health = he; ammo = am; skin = red; name = 0;

}

// ----------------------------------------------

monstr::monstr(color sk)

{

switch (sk)

{

case red:

health = 100;

ammo = 10;

skin = red;

name = 0;

break;

case green:

health = 100;

ammo = 20;

skin = green;

name = 0;

break;

case blue:

health = 100;

ammo = 40;

skin = blue;

name = 0;

break;

}

}

 

// ----------------------------------------------

 

monstr::monstr(char* nam)

{

name = new char [strlen(nam) + 1];

// До довжини рядок додається 1 для зберігання нуль-символа

strcpy(name, nam);

health = 100; ammo =10; skin = red;

}

// ----------------------------------------------

 

monstr* m = new monstr ("Ork");

monstr Green (green);

 

Перший з приведених вище конструкторів є конструктором за умовчанням, оскільки його можна викликати без параметрів. Об'єкти класу monstrтепер можна ініціалізувати різними способами, необхідний конструктор буде викликаний залежно від списку значень в дужках. При завданні декількох конструкторів слід дотримуватись тих же правил, що і при написанні переобтяжених функцій – у компілятора має бути можливість розпізнати потрібний варіант.

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

 

monstr::monstr(int he, int am):

health (he), ammo (am), skin (red), name (0){}

 

Поля перераховуються через кому. Для кожного поля в дужках указується значення, що ініціалізується, яке може бути виразом. Без цього способу не обійтися при ініціалізації полів-констант, полів-посилань і полів-об'єктів, В останньому випадку буде викликаний конструктор, відповідний вказаним в дужках параметрам.

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

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

– для локальних об'єктів – при виході з блоку, в якому вони оголошені;

– для глобальних –як частина процедури виходу з main();

– для об'єктів, заданих через вказівки, деструктор викликається неявно при використанні оператору delete.

Деструктор:

– не має аргументів та значення, яке повертається;

– не може бути оголошений як const або static;

– не успадковується.

Якщо деструктор явним чином не визначений, компілятор автоматично створює порожній деструктор. Описувати в класі деструктор явним чином потрібний у разі, коли об'єкт містить вказівки на пам'ять, що виділяється динамічно – інакше при знищенні об'єкту пам'ять, на яку посилалися його поля-вказівки, не буде помічена як вільна. Вказівку на деструктор визначити не можна. Якщо об'єкт містить вказівку на масив, скажімо поле char* name та ініціалізував в конструкторі, як name = new char[10], тоді деструктор повинен виглядати таким чином:

 

monstr::~monstr() {delete [ ] name;}

 

Деструктор можна викликати явним чином, наприклад:

 

Monstr* m;

m ─>~monstr();

 

Це може знадобитися для об'єктів, яким за допомогою перевизначеного оператору newвиділялася конкретна адреса пам'яті. Без необхідності явно викликати деструктор об'єкту не рекомендується.

 

Завдання

 

Завдання, розміщені в цьому розділі, окрім ознайомлення з класами містять інформацію про динамічні структури даних, перевантаження операторів тощо. Отже, відповідні завдання охоплюють декілька розділів та даються студентам по мірі проходження кожного з них.

Перелік варіантів завдань:

Варіант 1

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

Варіант 2

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

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

Варіант 3

Побудувати систему класів для опису плоских геометричних фігур: круг, квадрат, прямокутник. Передбачити методи для створення об'єктів, переміщення на площині, зміни розмірів і обертання на заданий кут.

Написати програму, що демонструє роботу з цими класами. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класів.

Варіант 4

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

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 5

Скласти опис класу для представлення комплексних чисел. Забезпечити виконання операцій додавання, віднімання та множення комплексних чисел.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 6

Скласти опис класу для об'єктів-векторів, які задаються координатами в тривимірному просторі. Забезпечити операції додавання та віднімання векторів з отриманням нового вектора (суми або різниці), обчислення скалярного добутку двох векторів, довжини вектора, косинуса кута між векторами.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 7

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

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 8

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

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 9

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

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 10

Скласти опис класу многочленів від однієї змінної, що задаються ступенем многочлена і масивом коефіцієнтів. Передбачити методи для обчислення значення многочлена для заданого аргументу, операції додавання, віднімання та множення многочленів з отриманням нового об'єкту-многочлена, виведення на екран опису многочлена.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 11

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

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 12

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

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 13

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

• перевизначені оператори привласнення і конкатенації;

• операції порівняння і приведення типів;

• перетворення в число будь-якого типу;

• виведення формату рядка.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 14

Описати клас "домашня бібліотека". Передбачити можливість роботи з довільним числом книг, пошуку книги за якою-небудь ознакою (наприклад, по авторові або по року видання), додавання книг в бібліотеку, видалення книг з неї, сортування книг по різних полях.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 15

Описати клас "записник". Передбачити можливість роботи з довільним числом записів, пошуку запису за якою-небудь ознакою (наприклад, по прізвищу, даті народження або номеру телефону), додавання і видалення записів, сортування по різних полях.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 16

Описати клас "студентська група". Передбачити можливість роботи із змінним числом студентів, пошуку студента за якою-небудь ознакою (наприклад, по прізвищу, даті народження або номеру телефону), додавання і видалення записів, сортування по різних полях.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 17

Описати клас, що реалізовує тип даних "дійсна матриця" і роботу з ними. Клас повинен реалізовувати наступні операції над матрицями:

• додавання, віднімання, множення, ділення (+, - *, / ) (множення і ділення як на іншу матрицю, так і на число);

• комбіновані операції привласнення (+=, -=, *=, /==);

• операції порівняння на рівність/нерівність;

• операції обчислення зворотної і транспонованої матриці, операцію піднесення до ступеня;

• методи обчислення детермінанта і норми;

• методи, що реалізовують перевірку типу матриці (квадратна, діагональна, нульова, одинична, симетрична, верхня трикутна, нижня трикутна);

• операції введення/виведення в стандартні потоки.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 18

Описати клас "множина", що дозволяє виконувати основні операції – додавання і видалення елементу, перетин, об'єднання і різницю множин.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

Варіант 19

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

Лабіринт представляється у вигляді матриці, що складається з квадратів. Кожен квадрат або відкритий, або закритий. Вхід в закритий квадрат заборонений. Якщо квадрат відкритий, то вхід в нього можливий з боку, але не з кута. Кожен квадрат визначається його координатами в матриці. Після відшукання проходу програма друкує знайдений шлях у вигляді координат квадратів.

Варіант 20

Описати клас "наочний покажчик". Кожна компоненту покажчика містить слово і номери сторінок, на яких це слово зустрічається. Кількість номерів сторінок, що відносяться до одного слова, від одного до десяти. Передбачити можливість формування покажчика з клавіатури і з файлу, виведення покажчика, виведення номерів сторінок для заданого слова, видалення елементу з покажчика.

Написати програму, що демонструє роботу з цим класом. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класу.

 


РОЗДІЛ 2. КЛАСИ І ПІДКЛАСИ

 

2.1. Конструктор копіювання

Конструктор копіювання – це спеціальний вид конструктора, який одержує єдиний параметр – вказівку на об'єкт цього ж класу:

 

T::T(const Т&) { ... / * Тіло конструктора*/ }

де Т – ім’я класу.

 

Цей конструктор викликається в тих випадках, коли новий об'єкт створюється шляхом копіювання існуючого об’єкту:

– при описі нового об'єкту з ініціалізацією іншим об'єктом;

– при передачі об'єкту у функцію за значенням;

– при поверненні об'єкту з функції.

Якщо програміст не вказав жодного конструктора копіювання, компілятор створює його автоматично. Такий конструктор виконує по елементне копіювання полів. Якщо клас містить вказівки або посилання, це, швидше за все, буде неправильним, оскільки і копія, і оригінал вказуватимуть на одну і ту ж область пам'яті.

Запишемо конструктор копіювання для класу monstr. Оскільки в ньому є поле name, що містить вказівку на рядок символів, конструктор копіювання повинен виділяти пам'ять під новий рядок і копіювати в неї початкову:

 

monstr::monstr(const monstr &M)

{

if (M.name)

{

name = new char [strlen(M.name) + 1];

strcpy(name, M.name);

}

else name = 0;

health = M.health; ammo = M.ammo; skin = M.skin;

}

monstr Vasia (blue);

monstr Super = Vasia; //Працює конструктор копіювання

monstr *m = new monstr ("Ork");

monstr Green = *m; // Працює конструктор копіювання

 

Будь-який конструктор класу, що приймає один параметр якого-небудь іншого типу, називається конструктором перетворення, оскільки він здійснює перетворення з типу параметра в тип цього класу.

Правила написання конструкторів класів, що входять в ієрархію, описані в розділі 3 "Спадкування класів".

 

2.2 Вкладені класи

 

Клас, оголошений усередині іншого класу, називається вкладеним. Він є членом охоплюючого класу, і його визначення може бути відкрите (public) або закрите (private). Рівень вкладеності не обмежується.

Ім'я вкладеного класу має бути унікальне в охоплюючому класі, але може збігатися з іншими іменами поза класом.

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

 








Дата добавления: 2014-12-26; просмотров: 1284;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.035 сек.