我有一个idl定义如下
typedef sequence<octet> ByteArray;
interface Connection {
ByteArray get_id ();
}
还有这个客户端代码
ByteArray * idToEncrypt = connection->get_id();
encryptId(idToEncrypt);
... // rest of code
函数encryptId()具有签名ByteArray* encryptId(ByteArray* idToEncrypt)
。我不能改变这个签名。
对于自动内存处理,idToEncrypt的类型已更改为ByteArray_var。问题是我不知道如何从ByteArray_var获取'ByteArray *'并将其传递给encryptId()。
有没有办法自动处理分配的内存“idToEncrypt”并仍将其作为“ByteArray *”传递给encryptId()?
答案 0 :(得分:3)
您应该查看CORBA规范中的_var
C++ mapping。
对于序列类型var,我认为最好的方法可能是使用inout()
成员,即:
ByteArray_var idToEncrypt = connection->get_id();
encryptId(&idToEncrypt.inout());
inout
返回一个非const引用,你只是用&
获取底层对象的地址。
注意:inout
取消引用内部指针,因此在inout()
上调用不存在指针的_var
是非法的。但是,对get_id()的调用必须始终返回有效指针,因此代码没有检查就可以了。
如果您需要通用方法,而您不知道_var
是否已初始化,则可以使用:
ByteArray* p = idToEncrypt.operator->();
因为operator->
似乎是直接获取指针的唯一方法。