Шрифт:
}
Это определение начинается с ключевого слова CORBA interface. Обратите внимание на то, что данное объявление интерфейса класса adding_machine не включает ни одной переменной, которая бы могла хранить результат выполнения операций сложения и вычитания. Методы add и subtract принимают в качестве параметра одно значение типа unsigned long. Объявление типа параметра сопровождается ключевым словом CORBA in, который говорит о том, что данный параметр является входным (mput). Это объявление класса хранится в отдельном исходном файле adding_machine.idl. Исходные файлы, содержащие ГОЬюпределения, должны иметь . idl-расширения. Прежде чем такой файл можно будет использовать, его необходимо преобразовать к С++чЈюрмату. Это преобразование можно выполнить с помощью препроцессора или отдельной программы. Все CORBA-реализации включают IDL-компиляторы. Существуют IDL-компиляторы лля языков С, Smalltalk, С++, Java и др. IDL-компилятор преобразует ГОЬюпределения в код соответствующего языка. В данном случае IDL-компилятор преобразует объявление интерфейса в легитимный C++-код. В зависимости от конкретной CORBA-реализации IDL-компилятор вызывается с использованием синтаксиса, который будет подобен слелующему:
idl adding_machine.idl
При выполнении этой команды создается файл, содержащий С++-код. Поскольку наше IDL-определение хранится в файле adding_machine. idl, MICO IDL-компилятор создаст файл adding_machine. h, который будет содержать несколько каркасных C++-классов и CORBA-типов данных. Базовые IDL-типы данных приведены в табл. 8.2.
Таблица 8.2. Базовые IDL – т ипы дан н ых
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& );