Реализация потоковых классов
Большинство функций-элементов, добавляемых к вашему классу с
функцией DECLARE_STREAMABLE, - это поставляемые функции. Однако
некоторые из них являются исключением и должны реализовываться
вне класса. Для таких определений также предусмотрены макрокоманды.
Макрокоманда IMPLEMENT_CASTABLE обеспечивает рудиментарный
надежный по типу механизм приведения. При построении с помощью
Borland C++ 4.0 вам не нужно это использовать, так как Borland
C++ 4.0 поддерживают информацию о типе этапа выполнения. Однако,
если вам нужно построить свой программный код с помощью компилятора, не поддерживающего информацию о типе, то нужно использовать
макрокоманду IMPLEMENT_CASTABLE. Макрокоманда DECLARE_CASTABLE
имеет несколько вариантов:
DECLARE_CASTABLE( cls )
DECLARE_CASTABLE( cls, base1 )
DECLARE_CASTABLE( cls, base1, base2 )
DECLARE_CASTABLE( cls, base1, base2, base3 )
DECLARE_CASTABLE( cls, base1, base2, base3, base4 )
DECLARE_CASTABLE( cls, base1, base2, base3, base4, base5 )
В некоторой точке своей программы вам следует вызвать эту
макрокоманду, указав в качестве параметра имя своего потокового
класса, а в качестве последующих параметров - имена потоковых базовых классов, например:
class Base1 : public virtual TStreamableBase
{
...
DECLARE_STREAMABLE( IMPEXMACRO, Base1, 1 );
};
IMPLEMENT_CASTABLE( Base1 ); // нет потоковой базы
class Derived : public Base1, public virtual Base2
{
...
DECLARE_STREAMABLE( IMPEXMACRO, Derived1, 1 );
};
IMPLEMENT_CASTABLE2( Derived, Base1, Base2 );
// две потоковых базы
class MostDerived : public Derived
{
...
DECLARE_STREAMABLE( IMPEXMACRO, MostDerived, 1 );
};
IMPLEMENT_CASTABLE1( MostDerived, Derived );
// одна потоковая база
Класс Derived использует IMPLEMENT_CASTABLE2, т.к. имеет два
потоковых базовых класса.
Кроме макрокоманд IMPLEMENT_CASTABLE где-либо в программе
вам следует вызвать макрокоманды IMPLEMENT_STREAMABLE. Эти макро-
команды выглядят аналогично:
DECLARE_STREAMABLE( cls )
DECLARE_STREAMABLE( cls, base1 )
DECLARE_STREAMABLE( cls, base1, base2 )
DECLARE_STREAMABLE( cls, base1, base2, base3 )
DECLARE_STREAMABLE( cls, base1, base2, base3, base4 )
DECLARE_STREAMABLE( cls, base1, base2, base3, base4, base5 )
Однако макрокоманда IMPLEMENT_STREAMABLE имеет одно важное
отличие от макрокоманд IMPLEMENT_CASTABLE: при использовании макрокоманд IMPLEMENT_STREAMABLE вам следует в списке параметров перечислить все потоковые классы и перечислить все виртуальные базовые классы, являющиеся потоковыми. Это связано с тем, что макрокоманда IMPLEMENT_STREAMABLE определяет специальный конструктор, который использует объектный потоковый код. Этот конструктор
должен вызывать все соответствующие конструкторы для всех прямых
базовых классов и всех соответствующих виртуальных классов.