# 聚合类型(union)
IDL 的联合类型将映射成 C++的类。例如下列 IDL 声明:
//IDL
struct S{
string str;
};
union U switch(long){
case 1:float f;
case 2:long v[100];
case 3:string s;
default:S st;
};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
将映射成下列 C++结构:
class U {
typedef long _v_slice;
typedef long _v_array[100];
public:
long __d;
union{
float _f_;
_v_slice* _v_;
char* _s_;
S* _st_;
};
unsigned char isSet;
U()
{
isSet = 0;
_f_ = 0;
for (int i0=0;i0<100;i0++)
{_v_[i0] = 0;}
_s_ = NULL;
}
U(const U &IDL_s);
~U();
U& operator= (const U &IDL_s);
long _d() const {return __d;}
float f () const{return _f_; }
void f(float IDL_member);
_v_slice* v () const { return (_v_); }
void v(_v_array IDL_member);
const char * s () const { return _s_; }
void s(char * IDL_member);
S& st () {return (*_st_); }
const S& st () const {return (*_st_); }
void st(const S& IDL_member);
void Marshal(CDR *cdr) const ;
void UnMarshal(CDR *cdr);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# IDL 定义示例
接口定义语言(IDL)字符串类型在 idl 文档中定义(以结构体为例):
struct S{
string str;
};
union UserDataType switch(long){
case 1:float f;
case 2:long v[100];
case 3:string s;
default:S st;
};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 代码示例
生成测试用例后在 pub.cpp 中创建数据样本后添加赋值语句:
/* 6. 创建一个数据样本 */
/* 建议:该数据需要申请空间后使用,使用后用户需要调用delete_data进行内存等资源的释放*/
UserDataType *instance = NULL;
instance = UserDataTypeTypeSupport::create_data();
//设置有效类型为float:
instance->__d = 1;
//给该类型赋值:
instance->f(2);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 数据收发示例
图 1 为使用 IDL 定义示例中结构体生成的测试 demo,在 Windows 系统上启动发布端、在 Linux 系统启动订阅端后数据收发情况。
图 1 聚合体数据收发示例(Windows->Linux)
图 2 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动订阅端、在 Linux 系统启动发布端后数据收发情况。
图 2 聚合体数据收发示例(Linux -> Windows)