Главная->Інформатика та програмування->Содержание->Совместимость структур данных

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

Совместимость структур данных

Для корректной работы программы чтения и записи объектов (такие, как OPERS и

IPERS) должны иметь в виду один класс объектов. Например, объекты класса

person имеют длину ровно 82 байта, из которых 80 отведено под имя человека,

 

2 — под возраст в формате short. Если бы программы не знали длину полей, то

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

Несмотря на то что классы person в OPERS и IPERS имеют одинаковые компо-

нентные данные, у них могут быть совершенно разные методы. Скажем, в первой

программе есть функция getData(), тогда как во второй — showData(). Не имеет

значения, какие используются методы в классах, — они в файл вместе с данными

не записываются. Это для данных важен единый формат, а разногласие между

методами ни к каким последствиям не приводит. Впрочем, это утверждение спра-

ведливо только для обычных классов, в которых не используются виртуальные

функции.

Если вы пишете в файл и читаете объекты производных классов, необходи-

мо соблюдать большую осторожность. В этих объектах есть загадочное число,

которое ставится перед началом их области данных в памяти. Оно помогает

идентифицировать класс объекта при использовании виртуальных функций.

Когда вы записываете объект в файл, это число записывается наряду с другими

данными. Если меняются методы класса, идентификатор также изменяется. Если

в классе имеются виртуальные функции, то при чтении объекта с теми же данны-

ми, но другими методами возникнут большие трудности. Отсюда мораль: класс,

использующийся для чтения объекта, должен быть идентичен классу, использо-

вавшемуся при его записи.

Можно даже не пытаться произвести дисковый ввод/вывод объектов, компо-

нентами которых являются указатели. Легко догадаться, что значения указате-

лей не будут корректными при чтении объекта в другую область памяти.

 

26