Symbian基本規範:描述符
概要
描述符既是Symbian OS中基本的東西,同時也是比較非物件導向(non-OO)和物件導向(OO)設計方法的極好的例子。
在C語言中字串是下面這樣的:
char *hello = “hello”;
上面的語句使設定一些記憶體使其包含‘h’,‘e’,‘l’,‘l’,‘o’,‘/0’6個字元。strlen()函數從開始位元組掃描記憶體直到以Null 字元(‘/0’)結尾。如果你想擴充字元串,你需要知道給它分配了多少記憶體。
描述符抽象
通過兩個抽象類別表示出字串的基本需要:TDesC和TDes。
TDesC是常量的或者說不可修改的描述符,它包含有地址和長度資訊。在下面的情況下可以使用這個類:需要對資料做許多操作但不需要更改它,因此TDesC提供了許多不修改資料的函數。
TDes是可修改的描述符,它另外包含有最大長度資訊,它允許資料擴充或減小(只要不超過最大長度),因此,TDes提供許多可以修改資料的函數。
描述符的基本特徵是修改操作不可以超出已經分配的長度,但有一些類允許這樣做,例如CBufBase和它的衍生類別。如果一個TDes函數引發溢出將會產生系統錯誤(panic)。
因為TDesC和TDes包含了所有函數需要的訪問、操作字串和記憶體資料的功能,所以許多隻需要訪問資料的函數用const TDesC&做為參數,那些需要修改資料的函數用TDes&做為參數。
指標描述符
抽象描述符類有多種實現,其中最簡單的就是指標描述符。
TPtrC僅僅包含長度與地址資訊:它只需要兩個機器字來表示。TPtrC可以被設定為表示任何現存的資料。TPtr增加了最大長度資訊,因此它可以用來表示那些未完全分配的緩衝區(buffer)。
圖
TPtrC和TPtr與C語言中的char*有點兒類似,但因為描述符自己包含了長度資訊,所以不再需要掃描結尾的Null 字元(‘/0’)或為它分配空間。
緩衝器描述符
緩衝器描述符TBufC和TBuf中的資料就是自己的一部分,就像C語言中的字元數組(char[])。
圖
這種描述符使用C++的模板機制,通過一個整數參數指出緩衝器長度。
堆描述符
堆描述符HbufC包含的資料是存放在堆上的。
圖
這就像C語言中的(char*)malloc( length+1 )一樣通常用於預先不能確定長度的情況。因為是在堆上分配的,它總是通過HBufC*使用而不是直接定義HBufC對象。
描述符類
下面是完整的描述符類層次圖:
體現出了使用物件導向的優雅性。TBufCBase只是為了考慮實現的方便性,這也是物件導向中常有的習慣(然而它需要小心使用)。
描述符使得表示串列資料變的簡單。當描述符用於字串時,應該使用TDes(TDesC,TBuf…)等等,因為在Unicode編譯條件下,這些類通過typedef定義為TDes16(TDesC16,TBuf16…)等等。
因為描述符可以包含任何資料,包括Null 字元,所以它可以被用來引用位元組資料和普通緩衝器。在需要8位元據的情況下(無論是什麼編譯條件,有可能是Unicode編譯條件),你應該總是直接使用TDes8等形式。