Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КРАТКИЙ ОБЗОР С.doc
Скачиваний:
1
Добавлен:
26.10.2018
Размер:
2.11 Mб
Скачать

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. Сравните это определение стека с классами, задающими       стек, из предыдущих упражнений. Напишите небольшую программу,       использующую этот шаблон типа.