1

假设我有一个 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;

这至少从它的想法上是正确的还是有不同的工作方式?将不胜感激一些帮助或指向以易于理解的方式描述的文档。

4

2 回答 2

4

您必须正确使用 _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

于 2014-06-26T17:17:58.273 回答
1

约翰尼威廉森的回答很好。但你也问:

将不胜感激一些帮助或指向以易于理解的方式描述的文档。

请参阅Henning 和 Vinoski的《使用 C++ 进行高级 CORBA 编程》一书。

您还可以在此处下载官方IDL 到 C++ 语言映射文档的副本。IDL 到 C++11 语言的映射可在此处获得。

于 2014-06-27T14:35:55.370 回答