假设我有一个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;这至少是正确的想法,还是工作方式不同?如果能以一种可以理解的方式对文档进行描述,希望能得到一些帮助或提示。
发布于 2014-06-26 17:17:58
您必须正确地使用_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的更多详细信息,请参见C++11。
发布于 2014-06-27 14:35:55
约翰尼·威勒姆森的回答很好。但你也问:
如果能以一种可以理解的方式对文档进行描述,希望能得到一些帮助或提示。
参见Henning & Vinoski著的“使用C++进行高级CORBA编程”一书。
您还可以下载官方从IDL到C++语言映射文档的副本。IDL到C++11语言的映射是可用的这里。
https://stackoverflow.com/questions/24433768
复制相似问题