13.11 Упражнения
1. (*3)
Завершите определения функций-членов класса Type_info.
2. (*3) Предложите такую структуру объекта Type_info, чтобы функция Type_info::get_info() стала
лишней, и перепишите с учетом этого функции-члены Type_info.
3. (*2.5) Насколько наглядно вы сможете записать примеры с Dialog_box, не используя
макроопределения (а также расширения языка)? Насколько наглядно вам удастся записать их,
используя расширения языка?
4. (*4)
Исследуйте две широко распространенные библиотеки. Классифицируйте все библиотечные
классы, разбив их на: конкретные типы, абстрактные типы, узловые классы, управляющие классы и
интерфейсные классы. Используются ли абстрактные узловые классы и конкретные узловые
классы? Можно ли предложить более подходящее разбиение классов этих библиотек?
Используется ли обширный интерфейс? Какие имеются средства динамической информации о
типе (если они есть)? Какова стратегия управления памятью?
5. (*3)
Определите шаблонный вариант класса Pool из $$13.10.3. Пусть размер выделяемого элемента
памяти будет параметром шаблона типа, а не конструктора.
6. (*2.5) Усовершенствуйте шаблон типа Pool из предыдущего упражнения так, чтобы некоторые
элементы размещались во время работы конструктора. Сформулируйте в чем будет проблема
переносимости, если использовать Pool с типом элементов char, покажите как ее устранить.
7. (*3)
Если ваша версия С++ прямо не поддерживает динамические запросы о типе, обратитесь к
своей основной библиотеке. Реализован ли там механизм динамических запросов о типе? Если это
так, задайте операции из $$13.5 как надстройку над этим механизмом.
8. (*2.5)
Определите такой строковый класс, в котором нет никакого динамического контроля, и второй
производный от него строковый класс, который только проводит динамический контроль и
обращается к первому. Укажите плюсы и минусы такого решения по сравнению с решением,в
котором делается выборочный динамический контроль, сравните с подходом, использующим
инварианты, как было предложено в $$12.2.7.1. Насколько можно совмещать эти подходы?
9. (*4)
Определите класс Storable как абстрактный базовый класс с виртуальными функциями writeout()
и readin(). Для простоты допустим, что для задания нужного адресного пространства достаточно
строки символов. С помощью класса Storable реализуйте обмен объектами с диском. Проверьте его
на объектах нескольких классов по своему усмотрению.
10. (*4) Определите базовый класс Persistent с операциями save() и nosave(), который будет проверять,