ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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
Конечно же, можно выйти из программы и после записи на диск. Когда вы повторно запустите программу, все данные снова появятся и смогут быть про- читаны.
Эту программу легко расширить за счет добавления функций удаления ра- ботника, извлечения данных об одном конкретном работнике, поиска работника с конкретными характеристиками и т. д.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48