宽位字符串映射

上传人:woxinch****an2018 文档编号:39006265 上传时间:2018-05-10 格式:PPT 页数:51 大小:182.50KB
返回 下载 相关 举报
宽位字符串映射_第1页
第1页 / 共51页
宽位字符串映射_第2页
第2页 / 共51页
宽位字符串映射_第3页
第3页 / 共51页
宽位字符串映射_第4页
第4页 / 共51页
宽位字符串映射_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《宽位字符串映射》由会员分享,可在线阅读,更多相关《宽位字符串映射(51页珍藏版)》请在金锄头文库上搜索。

1、6.11 宽位字符串映射n宽位字符串映射与字符串映射基本一样。主要是由函数 wstring_alloc,wstring_dup和wstring_free来完成内存的分配和释放。定点数据类型的映射nC+中没有定点数据类型,因此C+对 定点数据类型的支持与运算是由一个类 和一组重载的运算符函数提供。namespace CORBA/class Fixed/;通过这一映射,就可以在C+中使用定 点数的数值,并对它们进行计算。定点数据类型的映射6.12.1 构造函数通过构造函数将完成这一转换:Fixed f=999;/ fiedFixed f1=1000.0;/ fiedFixed f2=1000.05

2、;/ fiedFixed f3=0.1;/ fiedFixed f=1E30;/ fiedFixed f=1E29+0.89;/ fied-1E29+0.8在初始化时由于二进制数表示上的特殊性,也可能会产生 一些变化,例如在许多现实中0.1的实际值是 0.10000000000000001。还可能被截断如1E290.89被截断 为1E290.8。定点数据类型的映射n对超过31个的整数位的数值进行初始化 会产生一个DATA_CONVERSION异常。n构造字符串类型的Fixed值遵循IDL定点 数常量的规则,字符串前面的0和后面的 0被忽略掉。“d”或“D”是可选的。例如:Fixed f1=“1

3、.2”; fixedFixed f1=“01.20D”; fixed。6.12.2 存取函数fixed_digits和fixed_scale成员函数分别返回数值位数 和小数位数的值。例如:Fixed f=“3.14D”coutnum=335.0/113; fp- al=CORBA:string_dup(“four”);delete fp;这里不需要调用用于内存分配与释放的辅助函数。结构的映射n6.13.4 包含结构成员的结构对于结构成员本身就是结构的情况,不需要使用特殊的映射规则, 只不过在调用时需要再加上取成员运算符(.)。例如:c1.result.num;其中result是一个结构变量。6

4、.14 序列的映射n6.14.1 无界序列的映射IDL序列可以映射成类似于向量的C+类,而向量中的元素数目是 可变的。每一个IDL序列都可以映射成一个单独的C+类。例如 :typedef sequence StrSeq;映射如下:class StrSeq_var;class StrSeq public:;对其解释如下: 1. StrSeq() 其函数是缺省构造函数。这个函数将创建一个空序列。调用一个缺省构造的序列的length存取函数将返回数值0。 n2. StrSeq(const StrSeq sq-length(4);for()(*sq)i=valuesi;/delete sq;在此使用的

5、是(*sq)i=valuesi,这将间接引用这个指针,间接引用 这个指针是必要的,因为需要用于下标运算符的StrSeq类型的表达 式。如果用sqi=valuesi就会产生错误,编译器会假定在处理序列 的数组,并且将const char *赋值给序列的第个i元素,这样会造成 编译时的错误。序列的映射n控制序列的最大值当构造一个序列变量时,可以通过最大值构造 函数提供一个序列中元素的最大数目:StrSeq myseq(10); /打算输入10个元素到序列中myseq.length(20); /最大值没有限制序列的长度for(CORBA:ULOng i=0; iidx;I-)seqI=seqI-1;

6、seqidx=elmt;/idx为此元素要插入的位置,elmt的值这段代码在原序列中增加一个元素,然后从序列的插入点到尾部一 个一个拷贝元素,从而将序列分开,最后给新的元素赋值。 删除元素可以用同样的代码,需要在删除点的左侧把序列连接起来 : void remove() for(CORBA:Ulong I=idx;I TextSeq; union ShippingInfo switch(long) case 0:Details packaging_info; default:TextSeq other_info;其中一个是一个结构,另一个是一个序列。映射如下:联合的映射class Shippi

7、ngInfo public:const Details /获得void dl_mem(const Details /修改Details /引用const TextSeq /获得void seq_mem(const Details /修改TextSeq /引用 ; 对于一些简单的类型,联合中包含了返回成员值的存取函数。(为了 避免不必要的数据拷贝,作用于复杂类型的存取函数返回常量引 用类型的数值),同时,对于简单的类型,每个成员函数都有一个 进行多层次拷贝的修改函数。 引用成员函数返回一个对联合成员的非常量引用,使用这个成员函 数可以提高效率。对于大的数据类型,通过调用存取函数和修改 函数对函数

8、进行修改的效率很低,因为这两个函数都进行多层次 拷贝。通过引用就可以修改联合成员的值,而不用进行拷贝。联合的映射n如果获得一个对联合成员的引用,这个成员必须是当前和激活 的。一旦有了一个对联合成员的引用,必须在相应成员处于激活 状态时才能使用这个成员。n6.16.5下面时安全使用联合的一些规则: (1) 不要试图访问一个与鉴别器不一致的联合成员。 (2) 不要假定联合成员在内存中会重叠。在C和C+中,联合成员在 内存中可以彼此重叠。然而,在IDL联合的C+映射并不提供这 一功能。 (3) 不要猜测什么时候会调用析构函数。C+映射并不指明什么时候 应该撤消联合的成员。如果激活一个新的成员,那么可

9、能会因为 效率的原因而推迟调用先前成员的析构函数。6.17 递归结构和递归联合的映射n考虑下面的递归联合:union Link switch(long)case 0:typeA ta;case 1:typeB tb;case 2:sequence sc; 上面的联合中包含一个递归成员sc。假设想要激活联合中的sc成员, 使得为一个空序列。激活一个联合成员的唯一方法就是向存取器 传递该成员的值,然而,sc是一个匿名类型,那么,如何来说明 一个这样类型的变量。C+映射可以通过在联合类中生成一个附加的类型定义来解决这一 问题:calss Linkpublic:typedef some_interna

10、l_identifier_sc_seq;/别的成员;递归结构和递归联合的映射n生成类中定义了一个_sc_seq类型名称来表示匿名类型。总的来说 ,如果联合u中包含了一个匿名类型的mem成员,那么mem的类型 就是u:_mem_seq。可以使用这个名称来正确地激活联合中地递归 成员:Link:_sc_seq myseq;/myseq是空的Link mylink;mylink.sc(myseq)/激活sc 这一映射规则也可以用于递归地结构。如果一个结构s中包含了一个 匿名成员mem,那么mem地类型名就是s:_mem_seq。 6.18 类型定义的映射IDL类型定义可以映射为C+中对于的类型定义。

11、类型的别名可以 与初始类型一样使用。6.19 用户定义类型和_var类n6.19.1 用于结构、联合和序列的_var类class T_car;解释如下: 1. T_var();缺省的构造函数将指向当前使用的实例的内部指针初始化为空指 针。这样做的结果是在初始化缺省构造的_var实例之前,不能使 用它。 2. T_var(T *)指针构造函数假定传递的指针指向一个动态分配的实例,并且拥有 对指针的所有权。 3. T_var(const T_var 这样将会生成两个C+类型:NameSeq,这是一个真正的序列,以 及NameSeq_var,这是一个对应的内存管理封装函数。对于String_var,

12、生成的_var类型只是用于为动态分配的变长度类型 获取返回值。例如:extern NameSeq * get_name();/返回分配的堆内存句柄NameSeq_var nsv=get_name();/nsv获得所有权/不需要考虑在此释放 6.19.3 使用_var类的一些缺陷 使用String_var需要注意的地方同样也适用与_var类。如果用一个指针 对_var实例进行初始化或对一个指针进行赋值,那么需要确认指 针确实三指向动态分配的内存,否则就会导致灾难性后果。用户定义类型和_var类n同时,将一个指针赋给_var实例后,在间接引用该指针时必须加以小心 。因为对_var的赋值将会释放前面

13、使用的实例,因此会使指向该实例的 指针失效。n6.19.4 定长度和变长度的结构、联合和序列之间的区别在变长度类型中:转换运算符可以用来把一个变长度的T_var传递给需要用到对指向T的指 针的引用的地方。其中的成员函数可以用来将T_var作为in、inout或out参 数来传递,而不是缺省的类型的转换。out成员函数释放当前使用的类型T的实例,以避免因为相同的T_var实例 连续传递给函数调用而产生内存泄漏。_retn()函数指向当前的类型的T的实例,并放弃对指针的所有权。它主要 用于创建一个T_var实例以避免内存的泄漏,然后又必须传递对当前使用 类型的所有权的情况。在定长度类型中:附加的构

14、造函数和赋值运算符可以用来构造T_var,或把T赋给T_var。其中 的成员函数可以用于不能正确处理缺省类型转换的编译器,同时,可以 提高代码的执行效率。用于定长度类型的out和_retn成员函数不会放弃对当前使用类型的所用权, 不能这样,是因为它们不返回一个指针。用户定义类型和_var类n6.19.5 数组的_var类型数组的_var类型与结构、联合和序列的_var类型具有相同的形式, 区别是数组的_var类型并不重载间接运算符,并且一些成员函数 的返回值类型也有所不同,变长和定长也不同。包含变长元素的数组的_var映射其中的成员函数与结构、联合和序列的_var类型中的成员函数的作 用完全相

15、同。数组映射的说明(1) 缺省的构造函数将指向当前使用数组的内部指针初始化为空指针(2) 参数为F_slice *的构造函数和赋值运算符都假定由F_alloc或F_dup 对数组分配内存,并且它们拥有对传递来的指针的所有权。(3) 拷贝构造函数和F_var &赋值运算符都进行多层次拷贝用户定义类型和_var类(4) 析构函数通过调用F_free来释放数组(5) 下标运算符允许使用数组下标,这样,F_var就可以当作数组来使 用(6) 通过转换运算符可以将数组作为in、inout或out参数来传递(7) 显示转换函数in、inout和out与结构、联合和序列中的使用方法一 样(8) 通过_retn函数可以放弃对当前使用类型的所用权 所有这些意味着,可以将_var数组当作正真的数组来使用,只是_var 数组必须通过动态分配内存来进行初始化。用户定义类型和_var类n包含定长元素的数组的_var映射包含定长元素的数组和包含变长元素的数组的_var例子之间的区别 是对于定长度元素,inout成员函数返回一个指针,而不是对指针 的引用,并且没有定义用于StructArray_slice * &的用户定义的转换 运算符。这些区别由变长和定长在参数传递上的不同所产生。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 高中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号