假设我有一个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()期间,服务将在某个时候分配一个数据对象,如下所示:
void Servant::foo(IDL::Data_out d)
{
d = new Data();
}
在客户端使用对象后,我将像这样删除它:
IDL::Data* d(NULL);
IDL::Data_out do(d);
_servantRef->foo(do);
delete d;
这至少是正确的想法,还是它的工作方式不同?如果能在文档中以一种可理解的方式描述这一点,我将不胜感激。
您必须正确使用_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::Data& d)
{
// modify d
}
有关IDL到c++ 11的详细信息,请参阅TAOX11。
Johnny Willemsen的回答很好。但是你还问:
如果能以一种可理解的方式描述这一点,我将非常感激。
参见Henning &的Advanced CORBA Programming with c++ 一书。Vinoski .
您还可以在这里下载官方IDL到c++语言映射文档的副本。这里提供了IDL到c++ 11语言的映射。