ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн

Код типа объекта

Мы умеем определять класс объекта, находящегося в памяти, но как узнать класс объекта, если мы собираемся читать его из файла? Никакой волшебной па- лочки в виде специальной функции на этот случай не предусмотрено. Поэтому при записи данных на диск необходимо записывать код (перечисляемую пере- менную типа employee_type) прямо перед данными объекта. До начала чтения из файла надо прочитать его значение и создать объект соответствующего типа. И только после этого можно копировать данные из файла в этот новый объект.

И никаких кустарных объектов, пожалуйста!

В голову иного программиста может прийти идея считывать данные объекта просто «куда-нибудь», например в массив типа char, а затем устанавливать указа- тель на этот массив.

char someArray[MAX]; aClass* aPtr_to_obj;

7/Никогда так не делайте! aPtr_to_obj = reinterpret_Cast<aClass*>(someArray);

 

Такой сделанный на коленке объект не будет создан. И попытки работать с указателем, делая вид, что он ссылается на него, ни к чему хорошему не при- ведут. Есть только два легитимных пути создать объект. Можно определить его вручную, тогда он будет создан на этапе компиляции:

aClass anObj;

 

Либо, если вы хотите, чтобы объект создавался в процессе работы програм- мы, используйте new и ассоциируйте его адрес с указателем:

aptr_to_obj = new aClass;

 

При корректном способе создания объекта запускается его конструктор. Это необходимо даже тогда, когда вы не определяете собственный, а используете конструктор по умолчанию. Ведь объект — это нечто более глобальное, нежели просто область памяти, в которой хранятся данные. Не забывайте, что это еще и набор методов, некоторые из них вы даже не видите!

Взаимодействие с программой EMPL_IO

Вот пример взаимодействия пользователя с нашей программой. Напоминаем, что в памяти у нас созданы объекты классов manager, scientist и laborer. Мы запи- сываем их на диск, затем считываем и выводим на экран. Для простоты названия из нескольких слов мы использовать не будем.

'a' – добавление сведений о работнике

'd' - вывести сведения обо всех работниках

'w' – записать все данные в файл

'r' – прочитать все данные из файла

'x' – выход

Ваш выбор: а

'm' для добавления менеджера 's' для добавления ученого 'l' для добавления рабочего Ваш выбор: m

Введите фамилию: Александров Введите номер:1111 Введите титул президент Введите налоги:20000

 

'a'           -              добавление сведений о работнике

'd'           -              вывести сведения обо всех работниках

'w'          -              записать все данные в файл

'r'            -              прочитать все данные из файла

'x'  - выход Ваш выбор: а

'm' для добавления менеджера

's' для добавления ученого

'l' для добавления рабочего Ваш выбор: s

Введите фамилию: Лебедев Введите номер:2222 Введите число публикаций: 99

'a' – добавление сведений о работнике

'd' - вывести сведения обо всех работниках

'w' – записать все данные в файл

'r' – прочитать все данные из файла

'x' – выход

Ваш выбор: а

'm" для добавления менеджера 's' для добавления ученого 'l' для добавления рабочего Ваш выбор: l

Введите фамилию: Шевелев Введите номер:3333

'a' – добавление сведений о работнике

'd' - вывести сведения обо всех работниках

'w' – записать все данные в файл

'r' – прочитать все данные из файла

'x' – выход

Ваш выбор: w

Идет запись 3 работников

'a' – добавление сведений о работнике

'd' - вывести сведения обо всех работниках

'w' – записать все данные в файл

'r' – прочитать все данные из файла

'x' – выход

Ваш выбор: r

Идет чтение 3 работников

'a' - добавление сведений о работнике

'd" - вывести сведения обо всех работниках

'w' - записать все данные в файл

'r' - прочитать все данные из файла

'x' – выход

Ваш выбор: d

Тип:менеджер Фамилия: Александров Номер:1111

Титул Президент Налоги гольф-клуба: 20000

Тип:Ученый Фамилия: Лебедев Номер:2222

Число публикаций: 99

Тип:рабочий Фамилия:Шевелев Номер:3333

Конечно же, можно выйти из программы и после записи на диск. Когда вы повторно запустите программу, все данные снова появятся и смогут быть про- читаны.

Эту программу легко расширить за счет добавления функций удаления ра- ботника, извлечения данных об одном конкретном работнике, поиска работника с конкретными характеристиками и т. д.

 

39