я реалізації даного завдання необхідно створити класи контейнера і ітераторів. Контейнер представлятиме концепцію зберігання списку, тобто матиме такі методи як додавання, виведення на екран і видалення елементів. Крім того, забороняється копіювати або привласнювати списки.
Всі ітератори будуть представлені класами-спадкоємцями базового ітератора, що забезпечує взаємодію з контейнером.
Також буде визначено клас винятків для обробки помилкових ситуацій, таких, як вихід за межі списку, видалення неіснуючого елемента і т.п.
.2 Проектування абстракції даних
У задачі зручно визначити 6 об'єктів - класів. Нехай клас контейнера списку іменується TList, клас базового ітератора - TListBasicIterator, класи-спадкоємці базового ітератора - TArrayIterator, TLineIterator, TReverseIterator, а клас винятків - TListException. Крім того реалізується структура Elem, що представляє конкретний елемент списку і має поле row, яке носить смисловий характер, і поле next, яке є покажчиком на наступний елемент.
Клас TList має поля first і cur, які є покажчиками на початковий і поточний елементи списку відповідно, оскільки список характеризується головним елементом і покажчиком, переміщається по списку.
Клас TListBasicIterator містить поля basic_cur і basic_first, що є покажчиками на поточний і початковий елементи відповідно. Даний клас дозволяє працювати з елементами контейнера, не впливаючи на елементи і покажчики контейнера.
Клас TArrayIterator не має полів, а тільки методи, що реалізують індексування елементів і підрахунку довжини списку.
Клас TLineIterator має поля first і cur, які є покажчиками на початковий і поточний елементи списку відповідно. Цей клас реалізує операції для роботи з контейнером як із списком.
Клас TReverseIterator має поля first і cur, які є покажчиками на початковий і поточний елементи списку відповідно. Даний итератор працює зі списком у зворотному порядку, тобто поле first вказує на останній елемент контейнера, а рух покажчика відбувається в сторону початкового елемента контейнера.
Клас TListException має поля errmsg і errnum типу char * і int відповідно, що носять інформацію про поточну виняткової ситуації (текст і код помилки).
1.3 Визначення семантики класів
Клас TList (контейнер для списку)
TList містить поля first і cur, що є покажчиками на перший і поточний елементи відповідно.
Даний клас містить також приватний метод CreateFirst, що створює перший елемент списку. Також клас має методи для роботи зі списком: isEmpty (перевірка списку на порожнечу), isEnd (перевірка досягнення покажчиком кінця списку), Rewind (встановлення покажчика у вихідне положення), Set (установка нового значення поточного елемента списку), Get (одержання значення поточного елементу списку), Next (зміщення покажчика на наступний елемент), InsertAfterCurrent (вставка елемента після поточного), AddLast (вставка елемента в кінець) і DeleteCurrent (видалення елемента з поточної позиції).
Крім того, реалізуються оператори виведення списку в потік і присвоювання, деструктора і конструкторів.
Клас TBasicIterator (базовий итератор)
Даний клас має єдиний конструктор, який отримує на вхід константну посилання на контейнер списку, і віртуальну функцію nothing, що показує, що даний клас є абстрактним і не повинен мати створених об'єктів в програмі.
Також клас має поля basic_cur і basic_first, що вказують на поточний і останній елементи списку відповідно. Поле basic_first вказує на той же елемент, що і поле first класу TList, однак basic_cur не збігається з покажчиком cur класу TList, що показує незалежність ітератора від контейнера.
Клас TArrayIterator (ітератор масиву)
Даний клас має єдиний конструктор, який отримує на вхід константну посилання на контейнер списку і реалізовану функцію nothing, що показує можливість створення об'єктів даного класу.
Крім того, реалізується оператор індексування елементів і метод Count для підрахунку числа елементів списку. Дані методи дозволяють працювати зі списком як з масивом.
Клас TLineIterator (итератор прямого обходу)
Даний клас має єдиний конструктор, який отримує на вхід константну посилання на контейнер списку і реалізовану функцію nothing, що показує можливість створення об'єктів даного класу.
Також реалізуються оператори, що дозволяють працювати з контейнером як з односпрямованим списком ...