- •75Федеральное агенство по образованию
- •Лабораторный практикум
- •Часть 1. Теоретические сведения 5
- •Часть 2. Лабораторный практикум 63
- •Часть 1 Теоретические сведения
- •1 . Классы и объекты Объектно-ориентированный подход к программированию
- •Понятия класса и объекта
- •Доступ к членам класса
- •Функции встроенные и невстроенные
- •Статические переменные-члены класса
- •2. Конструкторы и деструкторы Конструкторы
- •Конструктор с инициализацией членов класса по умолчанию
- •Деструкторы
- •3. Перегрузка
- •Перегрузка функций
- •Перегрузка конструкторов
- •Перегрузка операторов
- •4. Производные классы и наследование
- •Объявление производного класса
- •Состав производного класса
- •Защищенные члены класса
- •Конструкторы и производные классы
- •5. Виртуальные функции Понятие виртуальной функции
- •Обслуживание множества объектов класса
- •Использование виртуальных функций
- •Абстрактные базовые классы
- •6. Потоки ввода-вывода
- •Базовые операции с файловыми потоками
- •Перегрузка операторов вставки и извлечения
- •7. Живучесть объектов Проблемы хранения объектов на диске
- •Библиотечный класса string
- •Конструкторы
- •Функции-члены
- •Перегруженные операторы
- •Живучие объекты
- •Часть 2 Лабораторный практикум р аботы лабораторного практикума Работа №1. Понятия класса и объекта (индивидуальное задание а)
- •Работа №2. Встроенные и невстроенные функции-члены
- •Работа №3. Конструкторы
- •Работа №4. Деструкторы
- •Работа №5. Конструктор с инициализацией по умолчанию
- •Работа №6. Статическая переменная в составе класса
- •Работа №7. Перегрузка функций
- •Работа №8. Перегрузка конструкторов (индивидуальное задание b)
- •Работа №9. Перегрузка операторов (индивидуальное задание c)
- •Работа №10. Базовые и производные классы
- •Работа №11. Виртуальные функции
- •Работа №12. Потоки ввода-вывода
- •Работа №13. Перегрузка в прикладном классе операторов вставки и извлечения
- •Работа №14. Библиотечный класс string
- •Работа №15. Создание живучих объектов и запись их на диск
- •Работа №16. Чтение с диска живучих объектов
- •Индивидуальные задания лабораторного практикума
Работа №11. Виртуальные функции
Выполните модификацию предыдущей работы (№10b). Объявите функции Print() обоих классов виртуальными. В тексте программы создайте теперь уже один массив из 4-5 указателей на базовый класс. Некоторым из этих указателей назначьте адреса объектов базового класса (вызовом соответствующего конструктора со списком необходимых аргументов); другим указателям назначьте адреса объектов производного класса. В едином цикле сформируйте общий сводный отчет по объектам обоих классов. Изучив вывод программы, убедитесь в том, что хотя все указатели являются указателями на базовый класс, но для объектов каждого класса (базового или производного) вызывается соответствующий вариант виртуальной функции Print(), что дает возможность обрабатывать в одном цикле массивы объектов как базового, так и любого количества различных производных классов.
Работа №12. Потоки ввода-вывода
Воспользуйтесь в качестве заготовки программой из работы №9 (индивидуальное задание С). Удалите из класса описание перегруженного оператора сложения. Модифицируйте функции Draw1() и Draw2() так, чтобы первая выводила в окно заданную фигуру толстым цветным пером, а вторая – тонким черным. Объявите в качестве глобальных переменных четыре указателя на объекты вашего класса. В части а работы будет использоваться одна пара этих указателей; в части б – другая.
Включите в приложение обработку сообщения WM_CREATE. В функции OnCreate() создайте два объекта класса (используя объявленные ранее указатели): один – вызовом конструктора с некоторым разумным набором аргументов, а второй – “пустой” (с помощью конструктора по умолчанию). В функции OnPaint() последовательным вызовом для этого объекта обеих функций Draw() выведите в окно два изображения объекта. Убедитесь в том, что изображения геометрически совпадают.
а. Запись объекта на диск и чтение с диска традиционными файловыми функциями Windows. Включите в функцию OnCreate() предложения создания файла, записи в него содержимого вашего объекта, сброса указателя в файле в начало файла и чтения данных с диска в созданный заранее второй (неинициализированный) объект. В функции OnPaint() выведите (разными функциями Draw()) изображения обоих объектов – исходного и заполненного данными с диска. Убедитесь в совпадении изображений.
б. Запись объекта на диск и чтение с диска с помощью потоков ввода-вывода. Подключите к программе заголовочный файл <fstream.h>. Создайте в функции OnCreate()третий объекта вашего класса с отличным набором аргументов и четвертый – “пустой”. Создайте поток файлового вывода – объект класса ofstream, указав в аргументах конструктора новое имя файла. Вызовом функции write() для объекта потока запишите в файл содержимое объекта. В качестве аргументов этой функции указывается адрес объекта, приведенный к типу char*, и размер объекта в байтах. Закройте поток вывода.
Создайте поток файлового ввода – объект класса ifstream. Вызовом функции read() для этого объекта прочитайте данные с диска в четвертый (неинициализированный) объект. В функции OnPaint() выведите в окно изображения обоих объектов. Убедитесь в совпадении изображений.