# 聚合类型(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

将映射成下列 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

# 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

# 代码示例

生成测试用例后在 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

# 数据收发示例

图 1 为使用 IDL 定义示例中结构体生成的测试 demo,在 Windows 系统上启动发布端、在 Linux 系统启动订阅端后数据收发情况。

图 1 聚合体数据收发示例(Windows->Linux)

图 2 为使用 IDL 定义示例 中结构体生成的测试 demo,在 Windows 系统上启动订阅端、在 Linux 系统启动发布端后数据收发情况。

图 2 聚合体数据收发示例(Linux -> Windows)