Язык программирования C++ от Страуструпа


. Упражнения - часть 2


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

 




- Начало -  - Назад -