#corba #out-parameters #tao
#corba #out-параметры #tao
Вопрос:
Допустим, у меня есть функция IDL:
void foo(out Data d);
Когда я наследую сгенерированный код, подпись будет выглядеть примерно так:
void foo(IDL::Data_out d);
Мой первый вопрос заключается в том, что я должен передать на стороне клиента? Я пытался:
IDL::Data_out d;
_servantRef->foo(d);
но это не работает, потому что Data_out не имеет конструктора по умолчанию. Затем я попытался:
IDL::Data* d;
_servantRef->foo(d);
но теперь компилятор не может преобразовать IDL::Data* в IDL::Data_out. Следующее работает, но выглядит слишком сложным и, следовательно, некорректным:
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
Как я должен действовать дальше? Во время выполнения foo() servant в какой-то момент выделит объект данных, подобный этому:
void Servant::foo(IDL::Data_out d)
{
d = new Data();
}
Затем я удалю объект после его использования на стороне клиента следующим образом:
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;
Правильно ли это, по крайней мере, по своей идее, или это работает по-другому? Был бы признателен за небольшую помощь или указания на документацию, где это описано понятным способом.
Ответ №1:
Вы должны правильно использовать классы _var, они похожи на auto_ptr и убедитесь, что память освобождается, когда _var выходит из области видимости. Клиентский код должен быть
IDL::Data_var d;
_servantRef->foo (d.out ());
Вспомогательный код должен быть
void Servant::foo(IDL::Data_out d)
{
d = new Data();
}
Новое сопоставление IDL с языком C 11 упрощает этот путь, там клиентский код
IDL::Data d;
_servantRef->foo (d);
Вспомогательный код
void Servant::foo(IDL::Dataamp; d)
{
// modify d
}
См. TAOX11 для получения более подробной информации о IDL для C 11.
Ответ №2:
Ответ Джонни Виллемсена хорош. Но вы также спросили:
Был бы признателен за небольшую помощь или указания на документацию, где это описано понятным способом.
См. книгу Хеннинга и Виноски «Расширенное программирование CORBA на C «.
Вы также можете загрузить копию официального документа о сопоставлении IDL с языком C здесь . Сопоставление IDL с языком C 11 доступно здесь .