Четвертый Borland C++ и его окружение

       

Версии объектов


Различным реализациям одного и того же класса, изменяемым

при обслуживание, вы можете присваивать различные номера версий.

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

версию класса, может считывать поток, содержащий данные для старой версии класса, например:

class Sample : public TStreamableBase

{

int i;

DECLARE_STREAMABLE( IMPEXMACRO, Sample, 1 );

};

IMPLEMENT_CASTABLE( Sample );

IMPLEMENT_STREAMABLE( Sample );

void Sample::Streamer::Write( opstream& out ) const

{



out << GetObject()->i;

}

void *Sample::Streamer::Read( ipstream& in, uint32 ) const

{

in >> GetObject()->i;

return GetObject();

}

Предположим, вы записываете в файл несколько объектов данного типа и обнаруживаете, что вам нужно изменить определение класса. Это можно сделать так:

class Sample : public TStreamableBase

{

int i;

int j; // новый элемент данных

DECLARE_STREAMABLE( IMPEXMACRO, Sample, 2 ); // новая версия

};

IMPLEMENT_CASTABLE( Sample );

IMPLEMENT_STREAMABLE( Sample );

void Sample::Streamer::Write( opstream& out ) const

{

out << GetObject()->i;

out << GetObject()->j;

}

void *Sample::Streamer::Read( ipstream& in, uint32 ) const

{

in >> GetObject()->i;

if ( ver > 1 )

in >> GetObject()->j;

else

GetObject()->j = 0;

return GetObject();

}

Потоки, записываемые со старой версией Sample, будет иметь

для всех объектов типа Sample номер версии 1. Потоки, записываемые с новой версией, будут иметь для всех объектов типа Sample

номер версии 2. Код в Read проверяет номер версии и определяет,

какие данные представляет поток.

Библиотека потоков, используемая в предыдущих версиях

ObjectWindows и Turbo Vision, не поддерживает версий объектов.

Если вы используете эту библиотеку, функции Read будет передаваться номер версии 0.



Содержание раздела