Параллельное и распределенное программирование на С++
Шрифт:
IDL-типы данных
Диапазон
Размер
long
1
>
_2»-2' 5–
1
> 16 бит
0-2 v– 1
> 32 бит
IDL-типы данных
Диапазон
Размер
long
– 2
31
– 2
31
– 1
>= 32
short
– 2
15
– 2
15
– 1
>= 16 бит
unsigned long
0 - 2
32
– 1
>= 32 бит
unsigned short
0-2
16
– 1
>= 16 бит
float
IEEE с обычной точностью
>= 32 бит
double
IEEE с двойной точностью
>= 64 бит
char
ISO
л
атинский-1
>=8 бит
string
ISO
л
атинский-1, за иск
л
ючением ASCII
NULL
Переменный
boolean
TRUE ИЛИ FALSE
Не определен
octet
0-255
>=8 бит
any
Произвольный тип, идентифицируемый динамически
Переменный
Даже после того как IDL-компилятор создаст из определения интерфейса С++-код, реализация методов интерфейсного класса остается все еще неопределенной. IDL-компилятор создает несколько С++-конструкций, которые предназначены для использования в качестве базовых классов. В листинге 8.3 показано два класса, сгенерированных MICO IDL-компилятором на основе файла adding_machine.idl .
// Листинг 8.3. Два класса, сгенерированные
// MICO IDL-компилятором из файла
// adding_machine.idl
class adding_machine : virtual public CORBA::Object{
public:
virtual ~adding_machine;
#ifdef HAVE_TYPEDEF_OVERLOAD
typedef adding_machine_ptr _ptr_type;
typedef adding_machine_var _var_type;
#endif
static adding_machine_ptr _narrow(CORBA::Object_ptr obj );
static adding_machine_ptr _narrow(CORBA::AbstractBase_ptr obj );
static adding_machine_ptr _duplicate(adding_machine_ptr _obj ){
CORBA::Object::_duplicate (_obj); return _obj;
}
static adding_machine_ptr _nil{
return 0;
}
virtual void *_narrow_helper( const char *repoid );
static vector<CORBA::Narrow_proto> *_narrow_helpers;
static bool _narrow_helper2( CORBA::Object_ptr obj );
virtual void add( CORBA::ULong X ) = 0;
virtual void subtract( CORBA::ULong X ) = 0;
virtual CORBA::Long result = 0;
protected:
adding_machine{};
private:
adding_machine( const adding_machine& );
void operator=( const adding_machine& );
};
class adding_machine_stub : virtual public adding_machine{
public:
virtual ~adding_machine_stub;
void add( CORBA::ULong X );
void subtract( CORBA::ULong X ); CORBA::Long result;
private:
void operator=( const adding_machine_stub& );
};
Файл adding_machine.idl —
// Листинг 8.4. Класс реализации структурных классов, // созданных IDL-компилятором
class adding_machine_impl : virtual public adding_machine_skel {
private:
CORBA::Long Result;
public:
adding_machine_impl (void){
Result = 0;
};
void add(CORBA::ULong X){
Result = Result + X;
};
void subtract(CORBA::ULong X){
Result = Result - X;
};
CORBA::Long result(void){
return(Result);
};
Один из каркасных файлов, созданных IDL-ко м пилятором из интерфейсного клас са adding_machine, называется adding_machine_skel. Обратите внимание на то, что при выведении новых классов IDL-компилятор берет имя из определения интерфейса. Наш класс adding_machine_impl обеспечивает реализацию интерфейса функций, объявленного с использованием языка IDL. Во-первых, в классе adding_machine_impl объявляется член данных Result. Во-вторых, здесь предлагается реализация методов add, subtract и result . В то время как интерфейсный класс adding_machine включает объявление этих методов, класс adding_machine_impl обеспечивает их реализацию. Определяемый пользователем класс adding_machine_impl должен наследовать из базового класса множество функций, полезных для распределенного программирования. В этом и состоит основная схема работы, связанной с CORBA-программированием. Интерфейсный класс предназначен для представления используемых интерфейсов. Назначение IDL-компилятора ~ сгенерировать реальные каркасные С++-классы, исходя из определения интерфейса. Разработчик выводит класс из одного каркасных и обеспечивает реализацию методов, определенных в интерфейсном классе, и членов данных, которые должны использоваться для хранения атрибутов объекта. Итак, создание реальных С++-классов из IDL-определения представляет собой процесс, состоящий из трех действий.
1. Проектирование интерфейсов классов, отношений и иерархии с использование м языка IDL.
2. Использование IDL-ко м пилятора д ля генерирования реальных каркасных C++-классов на основе IDL-классов.
3. Использование наследования для создания пото м ков из одного из нескольких каркасных классов и реализация м етодов интерфейса, унаследованных от каркасных классов.
Мы рассмотрим этот процесс более детально ниже в этой главе. Но сначала познакомимся с базовой структурой программы потребителя.