Упражнения. Выведите из base два класса и для каждого определите iam() ("я есть"), которая выводит имя класса на печать

  1. (*1) Определите
2. class base {3. public:4. virtual void iam() { cout << "base\n"; }5. };

Выведите из base два класса и для каждого определите iam() ("я есть"), которая выводит имя класса на печать. Создайте объекты этих классов и вызовите для них iam(). Присвойте адреса объектов производных классов указателям base* и вызовите iam() через эти указатели.

  1. (*2) Реализуйте примитивы экрана (#7.6.1) подходящим для вашей системы образом.
  2. (*2) Определите класс triangle (треугольник) и класс circle (круг).
  3. (*2) Определите функцию, которая рисует линию, соединяющую две фигуры, отыскивая две ближайшие "точки соприкосновения" и соединяя их.
  4. (*2) Модифицируйте пример с фигурами так, чтобы line была rectangle и наоборот.
  5. (*2) Придумайте и реализуйте дважды связанный список, который можно использовать без итератора.
  6. (*2) Придумайте и реализуйте дважды связанный список, которым можно пользоваться только посредством итератора. Итератор должен иметь действия для движения вперед и назад, действия для вставления и удаления элементов списка, и способ доступа к текущему элементу.
  7. (*2) Постройте обобщенный вариант дважды связанного списка.
  8. (*4) Сделайте список, в котором вставляются и удаляются сами объекты (а не просто указатели на объекты). Проделайте это для класса X, для которого определены X::X(X&), X::~X() X::operator=(X&).
  9. (*5) Придумайте и реализуйте библиотеку для написания моделей, управляемых прерываниями. Подсказка:. Только это - старая программа, а вы могли бы написать лучше. Должен быть класс task (- задача). Объект класса task должен мочь сохранять свое состояние и восстанавливаться в это состояние (вы можете определить task::save() и task::restore()), чтобы он мог действовать как сопрограмма. Отдельные задачи можно определять как объекты классов, производных от класса task. Программа, которую должна исполнять задача, модет задаваться как виртуальная функция. Должна быть возможность передавать новой задаче ее параметры как параметры ее конструктора(ов). Там должен быть планировщик, реализующий концепцию виртуального времени. Обеспечьте функцию задержки task::delay(), которая "тратит" виртуальное время. Будет ли планировщик отдельным или частью класса task - это один из основных вопросов, которые надо решить при проектировании. Задача должна передавать данные. Для этого разработайте класс queue (очередь). Придумайте способ, чтобы задача ожидала ввода из нескольких очередей. Ошибки в ходе выполнения обрабатывайте единообразно. Как бы вы отлаживали программы, написанные с помощью такой библиотеки?

*1 К сожалению, об этом присваивании легко забыть. Например, в первом издании этой книги (английском - перев.) вторая строка конструктор derived::derived() читалась так:

if (this == 0) this = (derived*)43;

И следовательно, для d конструктор базового класса base::base() не вызывался. Программа была допустимой и корректно выполнялась, но очевидно делала не то, что подразумевал автор. (прим. автора)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: