Symbian系統(tǒng)開發(fā)教程2_第1頁
Symbian系統(tǒng)開發(fā)教程2_第2頁
Symbian系統(tǒng)開發(fā)教程2_第3頁
Symbian系統(tǒng)開發(fā)教程2_第4頁
Symbian系統(tǒng)開發(fā)教程2_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

作者:謝興enigma19971@轉(zhuǎn)載需注明出處Symbian系統(tǒng)已經(jīng)提供了一套已經(jīng)定義好的內(nèi)置的數(shù)器無關(guān)的,應當使用下面symbian系統(tǒng)提供的數(shù)據(jù)類型,而不要使用原生數(shù)據(jù)類型(native無符號的整數(shù)。一般情況下,使用TInt和TUint就可以了,除非是在考慮代碼優(yōu)化或兼容性的時候,才會用到TInt8,TInt16這樣的類型。TInt或TUint類型的整數(shù)。TInt64.在版本8.0之前,Symbian系統(tǒng)中不支持64位的算術(shù)運算,而是用兩個32位的值來實現(xiàn)64位的整數(shù),在8.0版本之后,TInt64和TUInt64才被定義為longlong類型,真正使用64位的內(nèi)置數(shù)據(jù)類型。TReal32和TReal64(TR這兩個數(shù)據(jù)類型相當于單精度和雙精度的浮點數(shù),由于浮點數(shù)的運算要比整一般應盡量避免使用浮點數(shù)的運算。分別對應窄或?qū)挼淖址ㄗⅲ核^窄字符通常ASCII碼字符,而寬字符是指unicTAny*意為指向任意內(nèi)容的指針,在這種意義上講,TAny相當于void,TAny*相當于這時,不要將它改寫為:TAnyhello(TAny);TBoolisLarger(TInta,{return(a>b)?ETrue:EFal}if(isLarger(4,3)==ETrue){...}//錯誤,編譯不過。if(isLarger(4,3)){...}2.1Symbian系統(tǒng)中的命名習慣:在Symbian系統(tǒng)中編寫代碼時,應當遵守種樣{voidSetAge(TIntaA}在symbian系統(tǒng)中存在幾種不同類型的類(class不同類型的類,其特性也各不相同。有的在堆(heap)上創(chuàng)建,有的在棧(stack)上創(chuàng)建,特別的是,類的實例(instance)的易區(qū)分型別,Symbian系統(tǒng)使用了一個簡單的命名規(guī)則:類名以大寫字母開頭(T,C,R悉這個類,但類的命名規(guī)則可以幫助他弄清你的意圖------如何用安全的方式初始化、使用下面,我主要討論不同型別的主要特性。T類的行為類似于C++中的內(nèi)置類型,因此,它們以T作前綴(”T”代表”Type”)。象內(nèi)置類型一樣,它們沒有析構(gòu)方法(destructor這導致的結(jié)果是:T類不能包含具有析構(gòu)方法的成員變量。所以,一般情況下,T類的成員變量只能是內(nèi)置類型的數(shù)據(jù)或者是其它的T類用”關(guān)系,而不是“擁有”關(guān)系(也就是說,這個T類對象并不負責對成員的創(chuàng)建和銷毀的工象可以在棧上創(chuàng)建,當程序流程退出函數(shù)或產(chǎn)生leave(一種代碼異常)的時候,系統(tǒng)自動清除它。即使T類有一個析構(gòu)方法,在發(fā)生異常(在Symbian系統(tǒng)中,異常被稱為leave)時Symbian系統(tǒng)也不會調(diào)用它,因為leave沒有模仿標準C++的拋出異常的做法。對象放入到清除棧(cleanupStack在發(fā)生異常的時候,清除棧(cleanupStack)會釋放這個對象。{RDebug::Print(_L("iamastuden{RDebug::Print(_L("please,don'tkillme}voidSampleFunction()CBase有兩個特點:首先,它有一個虛的析構(gòu)方法,這樣,可以通過CBase指針來刪除它的子類。代碼如下所示:please,don'tkillme!其次,CBase類和它的子類,重載了new操作符,這使得當它在堆上創(chuàng)建的時候,自動以您不必在構(gòu)造方法中去做這件事情。但是,在棧上創(chuàng)建對象時,情況此,C類的對象一定要在堆上創(chuàng)建。在類的析構(gòu)方法中調(diào)用delete來刪除它;后一種情況要復雜一些,在調(diào)用任何有潛在的異常(leave)的代碼之前,要把這個指針放到清除棧(cleanupstack)中,否則有可能發(fā)生內(nèi)存有的。和C類不同,Symbian系統(tǒng)中不存在一個對應的RBase類,所以一個R類應當有一個構(gòu)造方法Create()或Initialize()這樣的方法,它們用來分配資源,設置句柄成員變量的值,并返回錯誤代碼或是產(chǎn)生異常。R類通常也有對應的Close或Reset()類,用來釋放資源,重置句方法(當然,該方法也可以是其它名字,但它經(jīng)常被命名為Close或是有一個析構(gòu)方法釋放資源,這會引起資源的泄露?;蚓植孔兞看嬖诘摹V挥猩贁?shù)情況下,在堆上創(chuàng)建。果一個R類是一個堆上的自動變量(相對于成員變量您一但要保證資源被釋放,而且,變量本身也要被釋放。.?)不定義)一個私有的構(gòu)造方法和賦值操作。M是單詞Mixin的首字母。Symbian系統(tǒng)不贊成多繼承的做法,因為這個引入額外的復雜性,被用來定義回調(diào)接口或者是觀察者(observer)類。M類也可以被其它類繼承。下面我們給出兩個例子。{virtualvoidEatL(){virtualvoidNameL()classCCat:publicCB{virtualvoidEatL(){};//從MAnimal,經(jīng)過MDomesticAnimavirtualvoidNameL(){};//從MDomesticA//Otherfunctionsomi上面的例子演示了一個從CBase類和一個M類派生的具體類。而類MDomesticAnimal又是從MAnimal派生的。象接口一樣,由于不能被實例化,M類只能有虛(virtual)函數(shù),不派生的。在定義完類以后,然后可以用使用它。代碼如下:然下面的代碼卻是錯誤的。當用M類的指針引用一個對象的時候,如果用delete刪除這個指針,則這個M類必須提供一代碼沒有問題。{virtualvoidEatL()virtual~MAnimal();//增加一個虛的析構(gòu)方法。在Symbian系統(tǒng)中,字符串被稱為“描述符”(descriptor因為它們是自我描述的。在的長度和內(nèi)存布局的信息?,F(xiàn)在,讓我們來深入了解描述符的設計思想。在Symbian系統(tǒng)中,描述符是相當讓人迷惑的,因為它的種類繁多。不同種類的描也不同于C語言中的字符串。現(xiàn)在我們來討論:什么是描述符?它們是如何工作的?在探討這些不同的描述符之前,先讓我們需要弄清楚一個基本的概念:什么是字符串數(shù)據(jù)的“寬度”?這個長度指的是單個字符是8bit的,還是16bit的寬度。在早期的版本中,字符的寬度都是8bit的,后來為了支持Unicode字符集,從第5版起,Symbian系統(tǒng)將16bit的字符作為標準。Symbian系統(tǒng)現(xiàn)在支持這兩種字符長度的描述符,除了Copy()和Size()兩個方法以外,這兩種寬度的描述符的行為是完全一致的,這兩個方法的使用,我們后面再介紹。另外,有一套中立的描述符類型,16bit的寬字符。對中立(neutral)的類統(tǒng)第5版以后,默認的情況下,它們表示寬度為16bit的字符串。它們之間的關(guān)系比較另外一個問題是:描述符和字面量(literal)的區(qū)別。所謂字面量是指在編碼的時候就其中的"Helloworld"就是字面量。在Symbian系統(tǒng)中,對它們的處理是很不一樣的,這點我們在后面再介紹。有了這樣的一些認識,現(xiàn)在我們可以來看看有哪些描述符類型。在Symbian系統(tǒng)中描述符類型有兩大種類:不可修改(non-modifiable)的描述符和可修改(modifiable)的描述符。Length()方法返回了描述符的長度,因為,每個描述符對象在內(nèi)存中的布局都是同樣的,用4個字節(jié)來表示它所包含的數(shù)據(jù)的長度(實際上,只用了32個bit中的28個bit,剩余的4bit以,Length方法沒有被它的子類重寫,它對所有子類都有效。但是,根據(jù)實現(xiàn)子類的方法的不同,子類訪問數(shù)據(jù)的方式也不一樣,Symbian系統(tǒng)不要求它的子類通過虛來實現(xiàn)自己的訪問數(shù)據(jù)的方法。不用虛函數(shù)重寫的原因是因為,虛函數(shù)會給每個被派生的描述符對象增加4節(jié)字的額外負擔,c++用這4個字節(jié)來存放指向虛函數(shù)度的4個字節(jié)中,28bit用來表示長度,剩下的4bit用來表示描述符的類型。目前,symbian系統(tǒng)中有5種派生的描述符類型,4bit限制了描述符的種類最多只能有16種,但這已經(jīng)足夠了。子類可以通過調(diào)用基類TDesC的Ptr方法來訪問描述符的數(shù)據(jù),Ptr()方法檢查這4個bit,的內(nèi)存布局,并在Ptr方法中使用硬編碼的方法。后面,為了表述上的方便,我們也把度和訪問數(shù)據(jù)的方法,另外,它實現(xiàn)了所有的您想用來處理常量字符串的操作。所有的可修改的描述符都從TDes基類派生,而TDes本身又是從TDesC派生的。TDes有一個額外的成員變量用來存放為該描述符分配數(shù)據(jù)的最大長度。MaxLength()方法返回了這個最大的長度。像TDesC中的Length方法一樣,MaxLength()方法也不被TDes的子類繼承。TDes類提供了一系列的方法,用來對可修改字符串數(shù)據(jù)的操作,包括對字符串的方法和復制賦值的方法。這些方法都不負責分配內(nèi)存,假如它們超過了描述符的數(shù)據(jù)長度,例如,用Append方法在某個字符串后面附加另一個字符串時,在調(diào)用該方法之前,您法使用了斷言(assertion)來確保描述符的最大長度不會被超出。如果發(fā)生內(nèi)存溢出,錯誤。存陷阱?;騎Des類的實例?,F(xiàn)在我們來看看描述符的派生類,您可以實例化和使用派生類的對象。正如前面所說,這個地方是比較讓人迷惑的,因為描述符存在大量的派生類。前面,我們已經(jīng)解釋過為什么每個類會有三個不同的版本,例如:TDes8,TDes16局:指針描述符和緩存區(qū)描述符。不同之處在于,指針描述符持有一個指向字符串的指針,據(jù),也就是說字符數(shù)據(jù)本身構(gòu)成了描述符的一部分??偨Y(jié):TDes是所有的可修改的描述符的基類,并且它自己也是從TDesC派生的。它有一個能返回最大的內(nèi)存容量的方法和一系列的用來修改字符串數(shù)據(jù)的方法。3.3指針描述符(pointerdescr寬度,都可以分為三個版本,例如:窄字符版本TPtrC8,寬字窄版本TPtrC16和中立的版的,但有時候,它們也可以在堆上使用,例如:作為一個CBase派生類的成員變量的時候。在不可修改的描述符(TPtrC)中,指向數(shù)據(jù)的指針存放在長度的后面,因此,指針描述符的總長度為2個字(word在可修改的指針描述符中,它存放在最大長度的后面,因此,總長度為3個字。下圖比較了TPtr和TPtrC內(nèi)存布局.iLength(12)iMaxLengthiPtr·Helloworld!TPtrCiLen描述符中的數(shù)據(jù)是常量。所有的從基類TDesC中繼承的操作都是可訪問的。TPtrC定義了一系列的構(gòu)造方法,使得它能從其它的描述符、指向內(nèi)存的指針或以0結(jié)尾的C語言字符串構(gòu)造。//字面量描述符將在后面介紹_LIT(KLiteralDes,"Sixtyzipperswerequicklypickedjutebag");TPtrCpangramPtr(KLiteralDes);//從TPtrCcopyPtr(pangramPtr);//從其//TText8isasingle(8-bit)character,equivconstTText8*cString=(TText8*)"Waltz,badnymph,forquickjigsTPtrC8anotherPtr(cTUint8*memoryLocation;//PointerintomemoryinitializedeTIntlength;//LengthofmemorytoberepresentedTPtrC8memPtr(memoryLocation,length);//從一個指針構(gòu)造。這個指針本身可以改變成指向其他的字符串改變您的TPtrC所指向的數(shù)據(jù),那么您可以將TPtrC聲明為const,這樣,當您試圖用Set ()方法更改TPtrC所指向的數(shù)據(jù)時,編譯器會產(chǎn)生警告。//字面量描述符_LIT(KLiteralDes1,"Sixtyzipperswerequicklypickedfromthewovenjutebag");_LIT(KLiteralDes2,"Waltz,badnymph,forquickjigsvex");alpha.Set(KLiteralDes2);//alphapointstothedatainKLibeta.Set(KLiteralDes1);//betapointstothedatainKLiteralDes1constTPtrCgamma(beta);//Pointstothedatainbeta,KLigamma.Set(alpha);//Generatesawarning,butpointsto針構(gòu)造,并設置適當?shù)拈L度值和最大長度值。Des()方法,這個方法返回一個如下所示的TPtr對象:_LIT(KLiteralDes1,"Jackdawslovemybigsphinxofquartz");TBufC<60>buf(KLiteralDes1);//TBufCaredescribeTPtrptr(buf.Des());//Copyconstruction;canmodifythedatainbufTIntlength=ptr.Length();//Length=TIntmaxLength=ptr.MaxLength();//Maximumlength=60,asforbufTUint8*memoryLocation;//ValidpointerintTIntlen=12;//LengthofdataTIntmaxLen=32;//Maximumlengthtoberepr//ConstructapointerdescriptorfromapointerintomemoTPtr8memPtr(memoryLocation,maxLen);//length=0,maxlenTPtr8memPtr2(memoryLocation,len,maxL符的最大長度,會引發(fā)一個系統(tǒng)異常。像TPtrC一樣,TPtr也定義了一個Set方法,用來改變描述符所指向的數(shù)據(jù)。_LIT(KLiteralDes1,"Jackdawslovemybigsphinxofquartz");TBufC<60>buf(KLiteralDes1);//TBufCaredescribeTPtrptr(buf.Des());//PointstothecontentsofbufTUint16*memoryLocation;//ValidpointerintTIntmaxLen=40;//MaximumlengthtobereprTPtrmemPtr(memoryLocation,maxLen);memPtr=ptr;//memPtrdataisKLiteralDes1(37bytes),maxLength=_LIT(KLiteralDes2,"Thequickbrownfoxjumpsoverthelazydog");TBufC<100>buf2(KLiteralDes2);//TBufCaredescribeTPtrptr2(buf2.Des());//Pointstothedatainbuf//Replacewhatptrpointstoptr.Set(ptr2);//ptrpointstocontentsofbuf2,maxlength=100memPtr=ptr2;//AttempttoupdatememPtrwhichpanicsbecause//contentsofptr2(43bytes)exceedsmaxlengthofmemPtr(40bytes)您一定不要混淆了Set()方法和=()賦值操作。前者將改它的最大長度值。述符來講,字符串數(shù)據(jù)本身就是描述符的一部分。下圖給出了描述符的內(nèi)存布局:這兩種描述符通常用來存儲定長的或相對較小的字符串,常用來存放長度小于256個字TBufC<n>是不可修改的緩沖區(qū)類型,它主要用來存放字符串常量或是二進制數(shù)據(jù)。該然后再填充。_LIT(KPalindrome,"Satan,oscillatemymetalTBufC<50>buf1(KPalindrome);//ConstructedfromliteraldesTBufC<50>buf2(buf1);//Constructedf//ConstructedfromaNULL-terminTBufC<30>buf3((TText*)"NeveroddorTBufC<50>buf4;//Constructedempty,lebuf4=buf1;//buf4containsdatacopiedfrombuf1,lengthmodifiedbuf1=buf3;//buf1containsdatacopiedfrombuf3,lengthmodifiedbuf3=buf2;//Panic!Maxlengthofbuf3isinsufficientforbuf2data存區(qū)中的數(shù)據(jù),該怎么辦呢?系統(tǒng)提供了另一種途徑來修改數(shù)據(jù)。該類定義了Des方法,符中的iLength的值會跟著改變,但要記住,緩存區(qū)描述符的長度值只可能減小,而是不可能增大的,因為,描述符類是不提供內(nèi)存管理管理功能的。_LIT8(KPalindrome,"Satan,oscillatemymetalTBufC8<40>buf(KPalindrome);//ConstructedfromliteraldesTPtr8ptr(buf.Des());//dataisthestringinbuf,max//IllustratestheuseofptrtocopyandreplacecontentsofbufASSERT(ptr.Length()==buf.Length(_LIT8(KPalindrome2,"Arewenotdrawnonward,wefew,dptr=KPalindrome2;//Panic!KPalindrome2exceedsmaxlengthofptr(=40)這也是一個模板類,它是一個可修改的緩沖區(qū)描述符類,后面的<n>表示緩沖區(qū)大小。TBuf從TBufBase類派生,而TBufBase是從TDes派生的方法。像TBufC<n>一樣,TBuf<n>也定義了一系列的構(gòu)造方法和賦值操作。對所有的描述要確保數(shù)據(jù)長度不要超過緩存區(qū)的最大長度。如果需要使用動態(tài)分配的內(nèi)存,您可以使用基于堆的描述符,這個我們在后面要講到。使用動態(tài)數(shù)組的額外開銷是很高的。_LIT(KPalindrome,"Satan,oscillatemymetalTBuf<40>buf1(KPalindrome);//ConstructedfromliteraldescTBuf<40>buf2(buf1);//ConstructedfromconstantbufferdesTBuf8<40>buf3((TText8*)"DoGeeseseeGod?"TBuf<40>buf4;//Constructedempty,length=0,maximum//Illustratecopyandreplabuf4=buf2;//buf2copiedintobuf4,updatinglengthandmaxlengthbuf3=(TText8*)"Murderforajarofredrum";//updatedfromCstring建者更長的生存期。當您在編譯的時候還不能確定緩沖區(qū)長度的時候,堆描述符也是很有用的,這時,它的作用相當于C語言中的malloc。也許您已經(jīng)發(fā)現(xiàn),HBufC的類名以“H”開頭,這不符合Symbian系統(tǒng)中慣用的命名習慣。 ()方法,用來在堆上創(chuàng)建一個緩存區(qū)。正如您所見到,HBufC中的字母“C”表示這個表述符是不可修改的。對該類的操作幾乎和TBufC<n>一樣:該類提供了一套賦值操作,允許整異常;通過調(diào)用Des()方法,可以返回一個可修改的指針描述符(TPtr可以通過這個指針描述符來更改緩沖區(qū)中的內(nèi)容。_LIT(KPalindrome,"DoGeeTBufC<20>stackBuf(KPali//Allocatesanemptyheapdescriptorofmaxlength20HBufC*heapBuf=HBufC::NewLC(20);TIntlength=heapBuf->Length();//Currentlength=0TPtrptr(heapBuf->Des());//Modificationoftheheapdescriptorptr=stackBuf;//CopiesstackBufcontentsintoheapBuflength=heapBuf->LenHBufC*heapBuf2=stackBuf.AllocLC();//Fromstackbu*heapBuf2=KPalindrome2;//CopyandreplaceCleanupStack::PopAndDestroy(2,的大小。在修改緩存區(qū)的內(nèi)容之前,您要確保緩存區(qū)的內(nèi)存是足夠的。為了幫您簡化這些操作,HBufC提供的一套ReAllocL()方法,它可以用來擴展堆的緩存區(qū)(這個操作有可能會-pointer-asmemory.如果您在HBufC上調(diào)用Des()方法來獲取了TPtr,在經(jīng)過重新分配內(nèi)存后,TPtr中的成員變量iPtr有可能變成無效的。因此,為了確保安全,在重新分配內(nèi)存后,應該再次調(diào)用Des來創(chuàng)建一個新的TPtr對象。注:出于性能上的考慮,Symbian系統(tǒng)并沒有提供可修改的堆描述符HBuf??偨Y(jié):Symbian系統(tǒng)中總共有5種類型的描述符,TPtrC,PTtr,TBufC<n>,TBuf<n>和HBufC。下面的圖示表明了它們的繼承關(guān)系。3.7字面量描述符(LiteralDescr列的宏來創(chuàng)建的,這些宏可在頭文件e32def#define_L8(a)(TPtrC8(#define_LIT8(name,s)conststaticTLitC8<sizeo#define_L16(a)(TPtrC16((con#define_S16(a)((co#define_LIT16(name,s)conststaticTLitC16<sizeof(L##name={sizeof(L##s)/2-1,L#首先,我們來看_LIT,這是最有效率也是被使用得最多的一個。這個宏的用法如下:_LIT(KMyLiteralDescriptor,"Thequickbrownfoxjumpsoverthelazydog");后面KMyLiteralDescriptor就可以作為一個常量來使用,例如可以將它寫到文件或顯示給(在這個例子中是Thequickbrownfoxjumpsoverthelazydog在二進制程序中可以找到這除以2。也有類似的定義。{public:inlineconstTDesC16*operator&()inlineoperatorconstTDesC16&(inlineconstTDesC16&operator()()public: TTextiBuf[AliginlineconstTDesC16*TLitC16<S>::operator&(inlineconstTDesC16&TLitC16<S>::operator()(inlineTLitC16<S>::operatorconstTDesC16&(從上面的定義中可以看到,TLitC16(和TLitC8)并不從TDesC8或TDesC16與TBufC8或TBufC16具有相同的內(nèi)使用TDesC的地方。您也可以用如下的方法從一個字面量構(gòu)造一個指針描述符:TPtrC8thePtr(KMyLiteralDesc從字面量構(gòu)造緩沖區(qū)描述符需要一點小技巧。如果您用size去獲得_返回相應的TLitC對象的尺寸大小,這個尺寸相當于描述符內(nèi)容的尺寸加上額外的8個byte必須要將這額外的8個字節(jié)考慮進去。_LIT8(KExampleLit8,"Thequickbrownfoxjumpedoverthelazydog");TIntsize=sizeof(KExampleLit8);//52TBufC8<(sizeof(KExampleLit8)-8)>theStackBuffer(KExamp以用更簡單的方法,使用操作符來將字面量轉(zhuǎn)換成一個描述符,然后用這個得到的描述符來得到內(nèi)容的長度。但最簡單的方法是,使用操作符將對象轉(zhuǎn)換成描述符后,直接調(diào)TIntdescriptorLength=KExampleLit8.iTypeLength;////Formastackbufferdescriptoraroundth//CreateaheapbuffercopyingthecontentsoftheliteralHBufC8*theHeapBuffer=KExampleLit8().Allo//對寬字符字面量的操作類似_LIT16(KExampleLit16,"Thequickbrownfoxjumpedoverthelazydog");size=sizeof(KExampleLit16);//96bytes(codescriptorLength=KExampleLit16.iTypeLength;//44bytes(c用_L和_LIT生成的字面量,它們的內(nèi)存布局是有差異的,如下圖所示:現(xiàn)在我們簡單地看看_L和_S宏,這兩個宏已經(jīng)過時,但在測試代碼中還經(jīng)常用到。RDebug::Print(_L("Helloworld!"));這個代碼的作用相當于:_LIT(KLit,"Helloworld!");從上面的代碼可以看到,使用_L的好處在于,您可以直接使用它,而無需在使用之前,的指針指向字面量的第一個字節(jié)在ROM中的存儲位置。只要是在創(chuàng)建該字面量的生存期中二進制程序的體積增大。如果僅從存儲方式上看,_S宏和_L是相同的,但有一點不同------它不產(chǎn)生臨時的TPtrC描述符。如果您僅將它作為以0結(jié)尾的描述符使用,那么就使用_S宏。的方法和在使用描述符時一些常見的問題。在編寫代碼的時候,您可能不想被限制于只能使用TBuf,原因是僅僅因為某個特定的讓您的客戶也改變他們的代碼。這樣的改動是非常不理想的,因為它破壞了代碼的兼容性。除非您來掌管描述符(負責描述符的創(chuàng)建和銷毀工作您甚至可以不用知道描述符是基于堆的還是基于棧的。事實上,只要標準類型的描述符(我們前面提到的5種描述符類型之一就可以在它上面調(diào)用適當?shù)姆椒?,客戶代碼完全可以忽略描述符的內(nèi)存布局和它在內(nèi)例如,類RFile定義了read和write方法IMPORT_CTIntWrite(constTDesC8&IMPORT_CTIntRead(TDes8&aDes)在這兩個方法中,輸入的描述符被顯式地聲明為8bit的寬度,這樣可以既寫入字符串,外傳遞一個參數(shù)用來表示返回的數(shù)據(jù)長度。當寫一個函數(shù)的時候,如果參數(shù)是可修改的描述符生系統(tǒng)異常。當然,您也可能不希望在描述符數(shù)據(jù)區(qū)過短的情況下,描述符的方法會發(fā)生系統(tǒng)異常。的描述符。HBufC*CPoem::DoGetLineL(TIntaLineNu{//Codeomittedforclarit//containingthetextofaLineNumber(leavesifaLineNumberis//outofrange)}voidCPoem::GetLineL(TIntaLineNumber,TDes&aD{HBufC*line=DoGetLineL(aLineNum//Isthedescriptorlargeenough(4bytesorm//integerrepresentingthelengthofdatarequired?if(aDes.MaxLength()<line->Length()){if(aDes.MaxLength()>=sizeof(TInt)){//WritesthelengtTPckg<TInt>length(line->Le}//Leave&indicatethatthecUser::Leave(KErrOverflow);//LeavesaredescribedinChapter2{CleanupStack::PopAndDestr}}另一個方案是,在函數(shù)中分配堆緩沖區(qū),把它返還給調(diào)用者,由調(diào)用者負責銷毀它?;怲DesC實現(xiàn)了Ptr()方法,用來訪問描述符的數(shù)據(jù),該方法返回一個指向字符數(shù)組首地址的指針。您可以通過這個指針來直接操作字符串數(shù)據(jù)。代碼如下所示:TDesC實現(xiàn)了Size()andLength()方法,前者返回描述符所占有的字節(jié)數(shù),而后者返回的是描述符的字符長度。對8bit的描述符來講,它們是相等的,而對16bit的描述來說,Size(的數(shù)值是Length()的兩倍。可修改的描述符TDes實現(xiàn)的這個方法返回描述符的最大長度。填充描述符的內(nèi)容,可用Fill()方法。這個方案類似于C語言中的memse()TDes實現(xiàn)了一系列的重的Copy()方法,下面是其中的兩個:IMPORT_CvoidCopy(constTDesC8&IMPORT_CvoidCopy(constTDesC16&如可源描述符的長度超過目標描述符的最大長度,將會引發(fā)一個系統(tǒng)異常。我們已經(jīng)討論過描述符的一些特性,現(xiàn)在來關(guān)注一下使用描述符時經(jīng)常容易范的錯誤。首先,我們將創(chuàng)建和使用堆描述符HBufC。前面提到過,在已有的描述符上調(diào)用Alloc()()voidCSampleClass::UnnecessaryCodeL(constTDesC&aD{iHeapBuffer=HBufC::NewL(aDes.LeTPtrptr(iHeapBuffer-ptr.Copy(aDes);//以上代碼完全可以被下面的代替,下面代碼更有效率。iHeapBuffer=aDes.A}Anothercommonwaytointroducecomplexityoccursintheopposdirection,thatis,thegenerationofTDesC&fromaheapdescriptor.了復雜性。代碼如下所示:constTDesC&CSampleClass::MoreAccidentalCom{return(iHeapBuffer->Des(//以上代碼完全可以寫成return(*iHeapBuffer);//這樣更簡}另外一個比較微妙問題是,當您分配一個HBufC以返回一個TPtr對象。HBufC*buf=HBufC::NewL(9);可是,假如您回憶一下,可以知道在HBufC中,并沒有一個字(word)用來保存最大長TPtr需要這個最大長度的信息,這時問題來了,您從哪里得到這個最大長度呢?答案在于:可能并不是您所期望的值(在這個例子中為9)。這是由于您并沒有指定一個字對齊(word-aligned)的最大長度,所以們不能確定這個值到底是多少)。{//CreateabufferHBufC8*myBuffer=HBufC8::NewMaxL(KBufferLenTPtr8myPtr(myBuffer-TIntlen=myPtr.Length();/

溫馨提示

  • 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

提交評論