Библиотеки qt и stl. Иерархия объектов, коллекция, итераторы


Динамическая идентификация типов


Download 0.9 Mb.
bet7/9
Sana31.01.2023
Hajmi0.9 Mb.
#1142465
TuriЛабораторная работа
1   2   3   4   5   6   7   8   9
Bog'liq
1671980777134 Лаб раб 4п

Динамическая идентификация типов.
Динамическая идентификация типа характерна для языков, в которых поддерживается полиморфизм. В этих языках возможны ситуации, в которых тип объекта на этапе компиляции неизвестен.
В С++ полиморфизм поддерживается через иерархии классов, виртуальные функции и указатели базовых классов. При этом указатель базового класса может использоваться либо для указания на объект базового класса, либо для указания на объект любого класса, производного от этого базового.
Пусть коллекция содержит объекты различных классов и необходимо выполнить некоторые действия только для объектов определенного класса. Тогда в итераторе мы должны распознавать тип очередного объекта.
В стандарт языка С++ включены средства RTTI (Run-Time Type Idendification) − динамическая идентификация типов.
Информацию о типе объекта получают с помощью функции typeid, определение которой содержит заголовочный файл .
Общая форма записи функции typeid имеет следующий вид:
typeid ( <объект> )
Здесь объект является объектом, чей тип требуется определить. Функция typeid возвращает ссылку на объект типа typeinfo, который описывает тип объекта объект. Класс typeinfo определяет следующие публичные переопределенные операторы и методы:
bool operator== (const typeinfo &ob) const;
bool operator!= (const typeinfo &ob) const;
const char *name() const;
Перегруженные операторы == и != обеспечивают сравнение типов. Функция name() возвращает указатель на имя типа.
Когда функция typeid применяется к указателю на базовый класс полиморфного класса, она автоматически возвращает тип объекта, на который указывает указатель, в том числе любой класс, выведенный из базового класса. (Как уже говорилось, полиморфным классом называется класс, содержащий хотя бы одну виртуальную функцию).
Большинство объектов имеют виртуальные функции, хотя бы потому, что обычно деструктор является виртуальным для устранения потенциальных проблем с производными классами. Когда оператор typeid применяют к не полиморфному классу (в классе нет виртуальной функции), получают указатель или ссылку базового типа.
Пример использования typeid.


Если при обращении typeid(*p), p=NULL, то возбуждается исключительная ситуация bad_typeid.

Порядок выполнения работы.

  1. Дополнить иерархию классов лабораторной работы № 2 классами коллекциями. Например, для предметной области ФАКУЛЬТЕТ можно предложить классы “факультет”, “студенческая группа”, “кафедра”. Рекомендуется создать абстрактный класс − “подразделение”, который будет предком всех групп и абстрактный класс CObject (или использовать абстрактный класс библиотеки Qt), находящийся во главе всей иерархии.

  2. Написать для класса коллекции метод-итератор.

  3. Написать процедуру или функцию, которая выполняется для всех объектов, входящих в коллекцию (смотри пример в приложении).

  4. Написать демонстрационную программу, в которой создаются, показываются и разрушаются объекты коллекции, а также демонстрируется использование итератора.


Методические указания.

  1. Класс-коллекции должен соответствовать иерархии классов лабораторной работы №2, т.е. объекты этих классов должны входить в коллекцию. Например, для варианта 1 может быть предложена следующая иерархия классов:




При этом иерархия объектов будет иметь следующий вид:






  1. Для включения объектов в коллекцию cледует использовать третий способ (через связанный список структур типа CItem).

  2. Пример определения добавленных абстрактных классов:






  1. Иерархия объектов создается следующим образом (на примере ФАКУЛЬТЕТА):

    1. создается пустой ФАКУЛЬТЕТ,

    2. создается пустая КАФЕДРА,

    3. создаются ПРЕПОДАВАТЕЛИ и включаются в КАФЕДРУ,

    4. КАФЕДРА включается в ФАКУЛЬТЕТ,

    5. тоже повторяется для другой кафедры.

    6. создается пустая СТУДЕНЧЕСКАЯ ГРУППА,

    7. создаются СТУДЕНТЫ и включаются в СТУДЕНЧЕСКУЮ ГРУППУ,

    8. СТУДЕНЧЕСКАЯ ГРУППА включается в ФАКУЛЬТЕТ,

    9. тоже повторяется для другой студенческой группы.

  2. Удаляется ФАКУЛЬТЕТ (при вызове деструктора) в обратном порядке.

  3. Метод-итератор определяется в неабстрактных классах-коллекциях на основе выбранных запросов. Например, для класса СGroup (студенческая группа) может быть предложен итератор

    Download 0.9 Mb.

    Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling