Четвертый BORLAND С++ и его окружение

       

Реализация потоковых классов


Большинство функций-элементов, добавляемых к вашему классу с

функцией 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 определяет специальный конструктор, который использует объектный потоковый код. Этот конструктор

должен вызывать все соответствующие конструкторы для всех прямых

базовых классов и всех соответствующих виртуальных классов.



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