Бьерн Страуструп - Язык программирования С++. Главы 11-13 - Упражнения

ОГЛАВЛЕНИЕ

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(), который будет проверять, что деструктор создал объект в определенной памяти. Какие еще полезные операции можно предложить? Проверьте класс Persistent на нескольких классах по своему выбору.
   Является ли класс Persistent узловым классом, конкретным или абстрактным типом? Аргументируйте ответ.
11.(*3) Составьте только описание класса stack, который реализует стек с помощью операций create() (создать стек), delete()
   (уничтожить стек), push() (записать в стек) и pop() (читать из стека). Используйте только статические члены. Для привязки и обозначения стеков определите класс id. Гарантируйте, что пользователь сможет копировать объекты stack::id, но не сможет работать с ними иным способом. Сравните это определение стека с классом stack из $$8.2.
12.(*3) Составьте описание класса stack, который является абстрактным типом ($$13.3). Предложите две различные реализации для интерфейса, заданного stack. Напишите небольшую программу, работающую с этими классами. Сравните это решение с классами, определяющими стек, из предыдущего упражнения и из $$8.2.
13.(*3) Составьте такое описание класса stack, для которого можно в динамике менять реализацию. Подсказка: "Всякую задачу можно решить, введя еще одну косвенность".
14.(*3.5) Определите класс Oper, содержащий идентификатор (некоторого подходящего типа) и операцию (некоторый указатель на функцию).

Определите класс cat_object, содержащий список объектов Oper и объект типа void*. Задайте в классе cat_object операции:
   add_oper(), которая добавляет объект к списку; remove_oper(id), которая удаляет из списка объект Oper c идентификатором id;
   operator() (id,arg), которая вызывает функцию из объекта Oper c
   идентификатором id. Реализуйте с помощью класса cat_object
   стек объектов Oper. Напишите небольшую программу, работающую с этими классами.
15.(*3) Определите шаблон типа Object, служащий базовым классом для cat_object. С помощью Object реализуйте стек для объектов класса String. Напишите небольшую программу, использующую этот шаблон типа.
16.(*3) Определите вариант класса Object под именем Class, в котором объекты с одинаковым идентификатором имеют общий список операций.

Напишите небольшую программу, использующую этот шаблон типа.
17.(*3) Определите шаблон типа Stack, который задает традиционный и надежный интерфейс со стеком, реализуемым объектом шаблона типа Object. Сравните это определение стека с классами, задающими стек, из предыдущих упражнений. Напишите небольшую программу, использующую этот шаблон типа.