7寬位字符串映射_第1頁
7寬位字符串映射_第2頁
7寬位字符串映射_第3頁
7寬位字符串映射_第4頁
7寬位字符串映射_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、6.11 寬位字符串映射,寬位字符串映射與字符串映射基本一樣。主要是由函數(shù)wstring_alloc,wstring_dup和wstring_free來完成內(nèi)存的分配和釋放。,定點數(shù)據(jù)類型的映射,C+中沒有定點數(shù)據(jù)類型,因此C+對定點數(shù)據(jù)類型的支持與運算是由一個類和一組重載的運算符函數(shù)提供。 namespace CORBA / class Fixed /; 通過這一映射,就可以在C+中使用定點數(shù)的數(shù)值,并對它們進行計算。,定點數(shù)據(jù)類型的映射,6.12.1 構(gòu)造函數(shù) 通過構(gòu)造函數(shù)將完成這一轉(zhuǎn)換: Fixed f=999;/ fied Fixed f1=1000.0;/ fied Fixed f2

2、=1000.05;/ fied Fixed f3=0.1;/ fied Fixed f=1E30;/ fied Fixed f=1E29+0.89;/ fied-1E29+0.8 在初始化時由于二進制數(shù)表示上的特殊性,也可能會產(chǎn)生一些變化,例如在許多現(xiàn)實中0.1的實際值是0.10000000000000001。還可能被截斷如1E290.89被截斷為1E290.8。,定點數(shù)據(jù)類型的映射,對超過31個的整數(shù)位的數(shù)值進行初始化會產(chǎn)生一個DATA_CONVERSION異常。 構(gòu)造字符串類型的Fixed值遵循IDL定點數(shù)常量的規(guī)則,字符串前面的0和后面的0被忽略掉?!癲”或“D”是可選的。例如: Fix

3、ed f1=“1.2”; fixed Fixed f1=“01.20D”; fixed 。,6.12.2 存取函數(shù) fixed_digits和fixed_scale成員函數(shù)分別返回數(shù)值位數(shù)和小數(shù)位數(shù)的值。例如: Fixed f=“3.14D” coutf.fixed_digits()endl; /打印3 coutf.fixed_scale()endl; /打印2 6.12.3 轉(zhuǎn)換運算符 LongLong轉(zhuǎn)換運算符將一個Fixed值轉(zhuǎn)換為LongLong值。 LongDouble轉(zhuǎn)換運算符將一個Fixed值轉(zhuǎn)換為LongDouble值,定點數(shù)據(jù)類型的映射,6.12.4 截斷與舍入 trunca

4、te成員函數(shù)返回一個包括指定的數(shù)值位數(shù)與小數(shù)位數(shù)的新的Fixed值,并且在需要時,將小數(shù)位數(shù)進行截斷:例如: Fixed f=“0.99”; coutf.truncate(0)endl; /打印0 coutf.truncate(1)endl; /打印0.9 coutf.truncate(2)endl; /打印0.99 round成員函數(shù)返回一個包含指定的數(shù)值位數(shù)與小數(shù)的新的Fixed值,并舍入為指定的小數(shù)位數(shù): Fixed r; Fixed f1=“0.4”; Fixed f2=“0.45”; Fixed f3=“-0.445”; r=f1.round(0); /0 r=f1.round(1)

5、; /0.4 r=f2.round(0);/0 r=f1.round(1);/0.5 r=f3.round(1);/-0.4 r=f1.round(0);/-0.45,6.13 結(jié)構(gòu)的映射,6.13.1 定長度結(jié)構(gòu)的映射 IDL結(jié)構(gòu)使用相對應的成員映射到C+結(jié)構(gòu)。例如: struct Details double weight; unsigned long count; 映射為: class Details_var; struct Details CORBA:double weight; CORBA:unsigned long count; typedef Details_var _var_t

6、ype; /成員函數(shù);,結(jié)構(gòu)的映射,可以在代碼中使用生成的結(jié)構(gòu),和使用C+中的結(jié)構(gòu)一樣。例如: Details d; d.weight=9.5; d.count=12; C+允許靜態(tài)初始化聚集。 聚集:一個一個類、結(jié)構(gòu)或數(shù)組中沒有用戶說明的構(gòu)造函數(shù)、基類、虛擬函數(shù)或私有函數(shù)和保護的非靜態(tài)數(shù)據(jù)成員,那么這個類、結(jié)構(gòu)或數(shù)組都是一個聚集。上述的結(jié)構(gòu)就是一個聚集,因此可以如下初始化: Details d=9.5,12;,6.13.2 變長度結(jié)構(gòu)的映射: 對于變長度的結(jié)構(gòu),C+映射就必須解決內(nèi)存管理的問題。例如: struct F double num; string al; 映射如下: class F

7、_var; struct F CORBA:Double num; CORBA:String_mgr al; typedef F_var var_type; /成員函數(shù) ;,結(jié)構(gòu)的映射,在此IDL字符串被映射為一個String_mgr類型,而不是String_var或char *類型。String_mgr類似于String_var,其區(qū)別就是String_mgr類中缺省的構(gòu)造函數(shù)將字符串初始化為空字符串,而不是初始化為空指針。 將篏套的類型初始化為空字符串很有用,因為這就意味著,不需要在將用戶自定義類型傳遞給一個IDL接口之前,對它內(nèi)部的所有字符串成員顯示進行初始化。(因為將一個空指針傳遞給一個

8、IDL接口是非法的。)。不要在應用程序中將String_mgr作為一個類型來使用。這樣的話,代碼就不可移植。要用String_var。 除了將字符串初始化為空字符串之外,String_mgr與String_var一樣,用于內(nèi)存的自動管理,可以相互賦值。,結(jié)構(gòu)的映射,如果一個結(jié)構(gòu)包含一個變長數(shù)據(jù)類型,結(jié)構(gòu)會管理這一變長類型的內(nèi)存。因此只需要考慮最外部的內(nèi)存的內(nèi)存管理,例如: F c; c.num=1.0/3.0; c.al=CORBA:string_dup(“one”); /沒有內(nèi)存泄漏 以上定義了一個局部變量c,同時結(jié)構(gòu)中的構(gòu)造函數(shù)對結(jié)構(gòu)中的成員進行初始化。對num成員,構(gòu)造函數(shù)沒有做什么。然

9、而,al成員是一個篏套字符串,因此構(gòu)造函數(shù)將它初始化為一個空字符串。 為了給al賦值,必須要分配內(nèi)存,al再次負責這一內(nèi)存的釋放(賦值會對al調(diào)用operator=(char *)。,結(jié)構(gòu)的映射,當c離開作用域后,它的缺省析構(gòu)函數(shù)會釋放所有成員的內(nèi)存,并且調(diào)用al的析構(gòu)函數(shù),而al的析構(gòu)函數(shù)則會調(diào)用CORBA:string_free。這就意味著,當c離開作用域時不會由內(nèi)存的泄漏。 不能對c進行靜態(tài)初始化。 6.13.3 結(jié)構(gòu)的內(nèi)存管理 可以將結(jié)構(gòu)與程序中的其它變量進行同樣的處理。程序會自己完成大部分的內(nèi)存管理工作,這樣就可以自由地將結(jié)構(gòu)和結(jié)構(gòu)成員賦給其它地結(jié)構(gòu)和結(jié)構(gòu)成員。,結(jié)構(gòu)的映射, str

10、uct F c1;struct F c2; struct F c3; c1.num=.5;c1.al=CORBA:string_dup(“one”); c2.num=.25;c1.al=CORBA:string_dup(“two”); c3.num=.125;c1.al=CORBA:string_dup(“three”); c2=c1; /深層次賦值 C3.al=c1.al; /深層次賦值 C3.num=1.0 C3.al3=0; /不會影響c1和c2 C1.al0=O; /不會影響c2和c3 C1.al4=H; /不會影響c2和c3 /全部釋放,在結(jié)構(gòu)中,結(jié)構(gòu)及其成員賦值進行的是多層次地拷貝

11、。而且,當結(jié)構(gòu)刪除后,由三個字符串所占據(jù)地內(nèi)存由相應地String_mgr析構(gòu)函數(shù)進行自動釋放。 如果要處理動態(tài)分配的結(jié)構(gòu)的話,可以使用new和delete: F * fp=new F; fp-num=335.0/113; fp-al=CORBA:string_dup(“four”); delete fp; 這里不需要調(diào)用用于內(nèi)存分配與釋放的輔助函數(shù)。,結(jié)構(gòu)的映射,6.13.4 包含結(jié)構(gòu)成員的結(jié)構(gòu) 對于結(jié)構(gòu)成員本身就是結(jié)構(gòu)的情況,不需要使用特殊的映射規(guī)則,只不過在調(diào)用時需要再加上取成員運算符(.)。例如: c1.result.num; 其中result是一個結(jié)構(gòu)變量。,6.14 序列的映射,6

12、.14.1 無界序列的映射 IDL序列可以映射成類似于向量的C+類,而向量中的元素數(shù)目是可變的。每一個IDL序列都可以映射成一個單獨的C+類。例如: typedef sequence StrSeq; 映射如下: class StrSeq_var; class StrSeq public: ;,對其解釋如下: 1. StrSeq() 其函數(shù)是缺省構(gòu)造函數(shù)。這個函數(shù)將創(chuàng)建一個空序列。調(diào)用一個缺省構(gòu)造的序列的length存取函數(shù)將返回數(shù)值0。 2. StrSeq(const StrSeq sq-length(4); for() (*sq)i=valuesi; / delete sq; 在此使用的是(

13、*sq)i=valuesi,這將間接引用這個指針,間接引用這個指針是必要的,因為需要用于下標運算符的StrSeq類型的表達式。如果用sqi=valuesi就會產(chǎn)生錯誤,編譯器會假定在處理序列的數(shù)組,并且將const char *賦值給序列的第個i元素,這樣會造成編譯時的錯誤。,序列的映射,控制序列的最大值 當構(gòu)造一個序列變量時,可以通過最大值構(gòu)造函數(shù)提供一個序列中元素的最大數(shù)目: StrSeq myseq(10); /打算輸入10個元素到序列中 myseq.length(20); /最大值沒有限制序列的長度 for(CORBA:ULOng i=0; imyseq.length();i+) /初

14、始化 即使代碼中使用的最大元素數(shù)目是10個,序列中也會添加20個元素。這樣做完全沒問題,序列中會添加一些附加的元素以增加其長度。,提供序列的最大值主要與內(nèi)部管理緩沖區(qū)有關(guān)。如果使用最大值構(gòu)造函數(shù),序列會把一個內(nèi)部的最大值設(shè)為至少與所給的指一樣大的值。此外,序列保證了在當前長度沒有超過最大值時,不會再次為元素分配內(nèi)存。 還有可以提供高效。如果序列能夠知道我們所想要的元素數(shù)目,那么它就可以更加有效的分配內(nèi)存。減少了內(nèi)存分配函數(shù)的 調(diào)用次數(shù),并且減少了在增加序列長度時拷貝元素的次數(shù)。,序列的映射,注意: (1) 映射并不是每次調(diào)用最大值構(gòu)造函數(shù)時,它會預先分配內(nèi)存。相反,直到第一個元素創(chuàng)建后才會分配

15、內(nèi)存。 (2) 映射并不是保證最大值構(gòu)造函數(shù)分配的正好是序列所需的內(nèi)存,它可能分配的更多一些。 (3) 映射并不保證最大值構(gòu)造函數(shù)一次就能序列元素所需的內(nèi)存,它可能會在幾個不連續(xù)的緩沖區(qū)中分配序列元素的內(nèi)存。,(4) 映射并不保證序列元素占據(jù)一塊連續(xù)的內(nèi)存區(qū)域。為了避免再次分配元素,序列在擴展時可能會添加一些新的不連續(xù)的緩沖空間。 (5) 映射并不保證增加序列的長度會立即缺省構(gòu)造新創(chuàng)建的元素,映射的實現(xiàn)會直到賦給一個新的元素后才進行元素的構(gòu)造,在這個時候才會用拷貝構(gòu)造函數(shù)創(chuàng)建這個元素。 如果知道元素的最大數(shù)目,就可以使用最大值構(gòu)造函數(shù)來獲得更好的運行時性能。負責不要用這個函數(shù)。 不要使用指向序

16、列元素的指針。如果要只用的話,那么就必須非常注意再次分配內(nèi)存問題。因為再次定位將會使指針失效。,序列的映射,6.14.2 有界序列的映射 除了序列的最大值由所生成的類提供之外,有界序列的映射與無界序列的映射一樣。 有界序列與無界序列的區(qū)別只是在于,有界序列中沒有最大值構(gòu)造函數(shù),數(shù)據(jù)構(gòu)造函數(shù)不會接收一個最大值參數(shù)。 有界序列的長度超出最大值的話,那么就會出現(xiàn)不可預料的結(jié)構(gòu),往往使核心存儲。 6.14.3 序列使用中的一些限制 1. 元素的插入與刪除 序列映射中只是在序列的尾部改變序列的長度。如果想要將一個元素插入到序列中,那么就必須把元素拷貝到插入點的右側(cè)方來把序列分開。下面的附注函數(shù)預先把元素

17、插入到序列中一個指定的位置。如果指定位置的下標與序列的長度相同,則會插入在序列的尾部添加這一元素。函數(shù)中只能使用0到length()范圍內(nèi)的下標值。,序列的映射,void pre_insert() seq.length(seq.length()+1); for(CORBA:Ulong I=seq.length()-1;Iidx;I-) seqI=seqI-1; seqidx=elmt;/idx為此元素要插入的位置,elmt的值 這段代碼在原序列中增加一個元素,然后從序列的插入點到尾部一個一個拷貝元素,從而將序列分開,最后給新的元素賦值。 刪除元素可以用同樣的代碼,需要在刪除點的左側(cè)把序列連接起

18、來: void remove() for(CORBA:Ulong I=idx;Iseq.length()-1;I+) seqI=seqI+1; seq.length(seq.length()-1); ,序列的映射,如果經(jīng)常進行插入與刪除,尤其是對于具有復雜類型元素的長序列,這一性能就變得不太理想。在這種情況下,最好選擇更為適合的數(shù)據(jù)類型。 6.14.4 序列的使用規(guī)則 下面是安全使用序列的一些規(guī)則: (1) 不要去考慮什么時候會調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。序列映射的實現(xiàn)完全可能因為效率上的原因而延遲元素的構(gòu)造或釋放。只能假定元素在第一次賦值時由拷貝生成,在第一次訪問時進行缺省的構(gòu)造,在序列的長度減

19、小時或離開作用域后撤消。 (2) 如果release標志為false,就不要將序列傳遞給一個函數(shù),以對序列進行修改。如果序列沒有對緩沖去的所用權(quán)的話,被調(diào)用的函數(shù)在改變序列元素時可能造成內(nèi)存泄漏。 (3) 避免使用復雜類型的數(shù)據(jù)構(gòu)造函數(shù),對于復雜類型,數(shù)據(jù)構(gòu)造函數(shù)并沒有任何優(yōu)勢,只會使源代碼更為復雜。 (4) 記住,序列長度超出當前最大值的話會使元素在內(nèi)存中再次定位。,序列的映射,(5) 不要將序列的下標值超出序列的當前長度 (6) 不要使有界序列的長度增長到超出它的邊界 (7) 不要使用數(shù)據(jù)構(gòu)造函數(shù)或緩沖區(qū)操作函數(shù),除非確實需要。對緩沖區(qū)進行直接操作容易造成潛在的內(nèi)存管理的錯誤。(因為數(shù)據(jù)構(gòu)

20、造函數(shù)的問題很多,盡量不要使用此函數(shù),因此沒有介紹。),6.15 數(shù)組的映射,IDL數(shù)組可以映射成具有對應元素類型的C+數(shù)組。字符串元素被映射成String_mgr。這里的關(guān)鍵之處是字符串元素初始化為空字符串,否則的話,字符串元素類似于String_var(也就是說,需要考慮內(nèi)存管理)。 內(nèi)存分配函數(shù)返回一個空指針,以表示函數(shù)調(diào)用失敗,并不發(fā)送CORBA或C+異常。,內(nèi)存分配函數(shù)使用代碼中生成的數(shù)組的切片類型。一個數(shù)組的切片是第一維元素的類型(或者,對于二維數(shù)組就是行的類型)。在C+中,數(shù)組的表達式可以轉(zhuǎn)換成指向第一個元素的指針,而切片類型使該類型的指針的說明變得簡單。對于一個數(shù)組類型T,指向

21、第一個元素的指針可以說明為T_slice *。因為IDL數(shù)組映射為C+的實際數(shù)組,所以可以通過指針算法來遍歷數(shù)組的元素。 StrArray_copy函數(shù)用于對數(shù)組的內(nèi)容進行深層次拷貝,使用時既不需要對源數(shù)組進行動態(tài)分配,也不需要對目標數(shù)組進行動態(tài)分配。這一函數(shù)可以有效地實現(xiàn)數(shù)組地賦值。(因為IDL數(shù)組被映射為C+數(shù)組,而C+數(shù)組并不支持數(shù)組地賦值,所以映射不能提供用于數(shù)組賦值地重載運算符。),6.16 聯(lián)合的映射,IDL聯(lián)合不能被映射為C+聯(lián)合,變長度地聯(lián)合成員被映射成類,但是C+不允許聯(lián)合中包含帶有特殊構(gòu)造函數(shù)地類成員。此外,C+聯(lián)合不帶有判斷功能。為了解決這些問題,IDL聯(lián)合被映射成C+類

22、。例如: union U switch(char) caseL: long long_mem; casec: caseC char char_mem; default: long long_mem; ; 對應的C+類中還有一個用于存取每個聯(lián)合成員的成員函數(shù)和一個用于修改每個聯(lián)合成員的成員函數(shù)。此外,還有用于控制鑒別器和解決初始化和賦值問題的成員函數(shù)。映射如下:,聯(lián)合的映射,Class U_var; Class U Public: U(); U(const U 對于其它IDL類型,可能在類中還會有其它的成員函數(shù)。如果有的話,這些函數(shù)是映射實現(xiàn)的內(nèi)部函數(shù),可以不用考慮。,聯(lián)合的映射,6.16.1

23、聯(lián)合的初始化和賦值 1. U() 聯(lián)合的缺省構(gòu)造函數(shù)不會在應用程序中對類進行初始化,這就是說必須在讀取聯(lián)合的內(nèi)容之前對聯(lián)合進行初始化,甚至不允許讀取一個缺省構(gòu)造的聯(lián)合的鑒別器的值。 2. U(const U /沒有初始化 my_u.long_mem(99); /激活long_mem assert(my_u._d()=L); /驗證鑒別器 assert(my_u.long_mem()=99); /驗證值 以上沒有在調(diào)用缺省的構(gòu)造函數(shù)后對聯(lián)合進行初始化。調(diào)用long_mem成員的修改成員函數(shù)可以對聯(lián)合進行初始化,因為這樣的話會激活該成員,并設(shè)置它的值。 為了改變聯(lián)合中激活的成員,可以調(diào)用另外一個成

24、員的修改函數(shù),以給該成員賦值: my_u.char_mem(X);/激活和分配給char_mem my_u._d(C);/現(xiàn)在變成了C,聯(lián)合的映射,上面的代碼首先激活成員char_mem,此激活成員可以將鑒別器設(shè)為c或C其中的一個,但是無法知道到底是那一個值。上述代碼在激活成員后,將鑒別器的值明確設(shè)為C。 如果設(shè)置鑒別器的值會激活或失效一個成員的話,那么就不能設(shè)置鑒別器的值: my_u.char_mem(X); /激活和分配char_mem assert(my_u._d()=c|my_u._d()=C); my_u._d(c); /ok my_u._d(C); /ok my_u._d(X);

25、/非法,將激活string_mem 只能將鑒別器設(shè)為與當前激活的聯(lián)合成員一致的值(這里合法的值是c和C)。 設(shè)置聯(lián)合的缺省成員可以使鑒別器設(shè)定未定義的狀態(tài)。 上面的例子還說明。聯(lián)合內(nèi)部的字符串成員的作用類似于String_var。尤其是用于string_mem成員的修改成員函數(shù)是重載的,可以分別用于const char *、char *和String_var 這一聯(lián)合沒有default語句,但是當鑒別器為FALSE時有一隱式缺省成員。如果聯(lián)合有一個隱式缺省成員,那么映射將會生成一個附加的用于相應的C+類的_default成員函數(shù)。 class AgeOpt_var; class AgeOpt

26、void _default(); typedef AgeOpt_var _var_type; 映射遵照一些常規(guī)的準則,也會添加_default成員函數(shù)。_default成員函數(shù)可以激活聯(lián)合的隱式缺省成員,并且相應地設(shè)置鑒別器地值:,聯(lián)合的映射,AgeOpt my_age(); my_age._default(); /設(shè)置鑒別器為假 在這種情況下,鑒別器的唯一合法的值是0(表示FALSE)。然而下面的語句是非法的: AgeOpt my_age; my_age._d(0); /非法 在此通過設(shè)置鑒別器來激活一個聯(lián)合成員是非法的。(聯(lián)合中不存在的隱式成員會被當作聯(lián)合中的一個成員。) 同樣,不能通過設(shè)

27、置鑒別器的方法把一個已初始化的聯(lián)合重新設(shè)置為缺省的成員,必須使用_default成員函數(shù): AgeOpt my_age; my_age.age(38); /設(shè)置鑒別器為1 my_age._d(0); /非法 my_age._default(); /成功,聯(lián)合的映射,下面是一個有趣的聯(lián)合: enum HowManyPropsnone,some;all; union SpecifiedProps switch(HowmanyProps) case some: ProperyNameSeq prop_names; 聯(lián)合中允許兩個非數(shù)值的鑒別器的值:none和all。假設(shè)對聯(lián)合進行初始化,以將鑒別器的

28、值設(shè)置為none,這里再次需要使用_default成員函數(shù): SpecifiedProps sp; sp._default();/顯式激活默認成員,鑒別器現(xiàn)在是none或者all sp._d(none);/固定鑒別器 必須要調(diào)用_default()。如果不調(diào)用_default的話,就需要設(shè)置鑒別器來激活隱含的缺省成員,可這是非法的。,聯(lián)合的映射,6.14.4 包含復雜成員的聯(lián)合 如果聯(lián)合中包含了一個any類型的成員,或者包含了結(jié)構(gòu)、聯(lián)合、序列或定點數(shù)類型的成員,那么生成的類中將包含三個作用于每個聯(lián)合成員的成員函數(shù),而不是通常的兩個成員函數(shù)。 struct Details double weig

29、ht; long count; typedef sequence TextSeq; union ShippingInfo switch(long) case 0: Details packaging_info; default: TextSeq other_info; 其中一個是一個結(jié)構(gòu),另一個是一個序列。映射如下:,聯(lián)合的映射,class ShippingInfo public: const Details 對于一些簡單的類型,聯(lián)合中包含了返回成員值的存取函數(shù)。(為了避免不必要的數(shù)據(jù)拷貝,作用于復雜類型的存取函數(shù)返回常量引用類型的數(shù)值),同時,對于簡單的類型,每個成員函數(shù)都有一個進行多層次拷

30、貝的修改函數(shù)。 引用成員函數(shù)返回一個對聯(lián)合成員的非常量引用,使用這個成員函數(shù)可以提高效率。對于大的數(shù)據(jù)類型,通過調(diào)用存取函數(shù)和修改函數(shù)對函數(shù)進行修改的效率很低,因為這兩個函數(shù)都進行多層次拷貝。通過引用就可以修改聯(lián)合成員的值,而不用進行拷貝。,聯(lián)合的映射,如果獲得一個對聯(lián)合成員的引用,這個成員必須是當前和激活的。一旦有了一個對聯(lián)合成員的引用,必須在相應成員處于激活狀態(tài)時才能使用這個成員。 6.16.5 下面時安全使用聯(lián)合的一些規(guī)則: (1) 不要試圖訪問一個與鑒別器不一致的聯(lián)合成員。 (2) 不要假定聯(lián)合成員在內(nèi)存中會重疊。在C和C+中,聯(lián)合成員在內(nèi)存中可以彼此重疊。然而,在IDL聯(lián)合的C+映射

31、并不提供這一功能。 (3) 不要猜測什么時候會調(diào)用析構(gòu)函數(shù)。C+映射并不指明什么時候應該撤消聯(lián)合的成員。如果激活一個新的成員,那么可能會因為效率的原因而推遲調(diào)用先前成員的析構(gòu)函數(shù)。,6.17 遞歸結(jié)構(gòu)和遞歸聯(lián)合的映射,考慮下面的遞歸聯(lián)合: union Link switch(long) case 0: typeA ta; case 1: typeB tb; case 2: sequence sc; 上面的聯(lián)合中包含一個遞歸成員sc。假設(shè)想要激活聯(lián)合中的sc成員,使得為一個空序列。激活一個聯(lián)合成員的唯一方法就是向存取器傳遞該成員的值,然而,sc是一個匿名類型,那么,如何來說明一個這樣類型的變量。

32、 C+映射可以通過在聯(lián)合類中生成一個附加的類型定義來解決這一問題: calss Link public: typedef some_internal_identifier_sc_seq; /別的成員;,遞歸結(jié)構(gòu)和遞歸聯(lián)合的映射,生成類中定義了一個_sc_seq類型名稱來表示匿名類型??偟膩碚f,如果聯(lián)合u中包含了一個匿名類型的mem成員,那么mem的類型就是u:_mem_seq。可以使用這個名稱來正確地激活聯(lián)合中地遞歸成員: Link:_sc_seq myseq;/myseq是空的 Link mylink; mylink.sc(myseq)/激活sc 這一映射規(guī)則也可以用于遞歸地結(jié)構(gòu)。如果一個結(jié)

33、構(gòu)s中包含了一個匿名成員mem,那么mem地類型名就是s:_mem_seq。 6.18 類型定義的映射 IDL類型定義可以映射為C+中對于的類型定義。類型的別名可以與初始類型一樣使用。,6.19 用戶定義類型和_var類,6.19.1 用于結(jié)構(gòu)、聯(lián)合和序列的_var類 class T_car ; 解釋如下: 1. T_var(); 缺省的構(gòu)造函數(shù)將指向當前使用的實例的內(nèi)部指針初始化為空指針。這樣做的結(jié)果是在初始化缺省構(gòu)造的_var實例之前,不能使用它。 2. T_var(T *) 指針構(gòu)造函數(shù)假定傳遞的指針指向一個動態(tài)分配的實例,并且擁有對指針的所有權(quán)。 3. T_var(const T_va

34、r 這樣將會生成兩個C+類型:NameSeq,這是一個真正的序列,以及NameSeq_var,這是一個對應的內(nèi)存管理封裝函數(shù)。 對于String_var,生成的_var類型只是用于為動態(tài)分配的變長度類型獲取返回值。例如: extern NameSeq * get_name();/返回分配的堆內(nèi)存句柄 NameSeq_var nsv=get_name();/nsv獲得所有權(quán) /不需要考慮在此釋放 6.19.3 使用_var類的一些缺陷 使用String_var需要注意的地方同樣也適用與_var類。如果用一個指針對_var實例進行初始化或?qū)σ粋€指針進行賦值,那么需要確認指針確實三指向動態(tài)分配的內(nèi)存,否則就會導致災難性后果。,用戶定義類型和_var類,同時,將一個指針賦給_var實例后,在間接引用該指針時必須加以小心。因為對_var的賦值將會釋放前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論