Ієрархія класів є ієрархія за принципом успадкування, тобто типу "це є різновид того". Наприклад, "робочий є різновид персони", "автомобіль" є різновид "транспортного засобу". На відміну від цього ієрархія об'єктів це ієрархія за принципом входження, тобто типу "це є частина того". Наприклад, "установка частина заводу", "двигун" частина "автомобіля". Таким чином, об'єкти нижнього рівня ієрархії включаються в об'єкти більш високого рівня, які є для них групою.
Ітератори дозволяють виконувати деякі дії для кожного елемента певного набору даних.
Такий цикл міг би бути виконаний для всього набору, наприклад, щоб надрукувати всі елементи набору, або міг би шукати певний елемент, який задовольняє певній умові, і в цьому випадку такий цикл може закінчитися, як тільки буде знайдений необхідний елемент.
Ми будемо розглядати ітератори як спеціальні методи класу-групи, що дозволяють виконувати деякі дії для всіх об'єктів, включених в групу. Прикладом ітератора є метод Show.
Нам би хотілося мати такий итератор, який дозволяв би виконувати над усіма елементами групи дії, задані не одним з методів об'єкта, а довільною функцією користувача. Такий итератор можна реалізувати, якщо цю функцію передавати йому через покажчик на функцію.
Визначимо тип покажчика на функцію наступним чином:
typedef void (* PF) (TObject *,<дополнительные параметры>);
Функція має обов'язковий параметр типу TObject або TObject *. через який їй передається об'єкт, для якого необхідно виконати певні дії.
Метод-итератор оголошується наступним чином:
void TGroup :: ForEach (PF action,<дополнительные параметры>);
action єдиний обов'язковий параметр-покажчик на функцію, яка викликається для кожного елемента групи;
додаткові параметри передані функції, що викликається параметри.
Потім визначається покажчик на функцію і инициализируется переданої Ітератор функцією.
Тоді итератор буде викликатися, наприклад, для додаткового параметра типу int, так:
Тут gr об'єкт-група.
Динамічна ідентифікація типів.
Динамічна ідентифікація типу характерна для мов, в яких підтримується поліморфізм. У цих мовах можливі ситуації, в яких тип об'єкту на етапі компіляції невідомий.
В С ++ поліморфізм підтримується через ієрархії класів, віртуальні функції і покажчики базових класів. При цьому покажчик базового класу може використовуватися або для вказівки на об'єкт базового класу, або для вказівки на об'єкт будь-якого класу, похідного від цього базового.
Нехай група містить об'єкти різних класів і необхідно виконати деякі дії тільки для об'єктів певного класу. Тоді в Ітератор ми повинні розпізнавати тип чергового об'єкта.
У стандарт мови С ++ включені кошти RTTI (Run-Time Type Idendification) динамічна ідентифікація типів. Ці кошти реалізовані в останніх системах Borland C ++ (версій 4.0 і вище).
Інформацію про тип об'єкта отримують за допомогою оператора typeid, визначення якого містить заголовки
Є дві форми оператора typeid:
Оператор typeid повертає посилання на об'єкт типу type_info.
У класі type_info перевантажені операції == і! = Забезпечують порівняння типів.
Функція name () повертає покажчик на ім'я типу.
Є одне обмеження. Оператор typeid працює коректно лише з об'єктами, у яких визначені віртуальні функції. Більшість об'єктів мають віртуальні функції, хоча б тому, що зазвичай деструктор є віртуальним для усунення потенційних проблем з похідними класами. Коли оператор typeid застосовують до неполіморфному класу (в класі немає віртуальної функції), отримують покажчик або посилання базового типу.
Якщо при зверненні typeid (* p), p = NULL, то порушується виняткова ситуація bad_typeid
Порядок виконання роботи.
1. Доповнити ієрархію класів лабораторної роботи № 2 класами "група".
Наприклад, для предметної області ФАКУЛЬТЕТ можна запропонувати класи "факультет", "студентська група", "кафедра". Рекомендується створити абстрактний клас "підрозділ", який буде предком всіх груп і абстрактний клас TObject. що знаходиться на чолі всієї ієрархії.
2. Написати для класу-групи метод-ітератор.
3. Написати процедуру або функцію, яка виконується для всіх об'єктів, що входять в групу (дивись приклади в додатку).
4. Написати демонстраційну програму, в якій створюються, показуються і руйнуються об'єкти-групи, а також демонструється використання ітератора.
1. Клас-група має відповідати ієрархії класів лабораторної роботи № 2, тобто об'єкти цих класів повинні входити в групу. Наприклад, для варіанта 1 може бути запропонована наступна ієрархія класів:
Tobject (абстр. Клас)
Персона (абстр. Клас) Підрозділ (абстрактна група)