第二章 :数类型语法
谢兴 转载需注明出处
Symbian系统已提供套已定义置数类型保证代码编译器关应面symbian系统提供数类型原生数类型〔native types里指标准C中int char等〕
1 根类型
TIntX TUintX (中X 8 16 32) 分表示 8位 16位 32位符号符号整数 般情况TInt TUint非考虑代码优化兼容性时候会TInt8TInt16样类型TInt TUint 类型分应符号符号整数
Ø TInt64 版80前Symbian系统中支持64位算术运算两32位值实现64位整数80版TInt64TUInt64定义long long类型真正64位置数类型
Ø TReal32 TReal64 (TReal相TReal64)
两数类型相单精度双精度浮点数浮点数运算整数慢般应量防止浮点数运算
Ø TTextX (中X 8 16)
分应窄宽字符〔注:谓窄字符通常ASCII码字符宽字符指unicode字符集字符 〕
Ø TAny*
TAny* 意指意容指针种意义讲TAny相void TAny* 相TAny*某场合void标示空’:
void hello(void)
时改写: TAny hello(TAny)
Ø TBool
标示布尔类型Symbian系统提供两常量:ETrue (1) EFalse (0)分表示真假
注意:Symbian系统中TBool定义int ETrueEFalse定义enum果函数返回值TBool代码拟函数返回值:
TBool isLarger〔TInt a TInt b〕
{
return (a>b)ETrueEFalse
}
if(isLarger(43)ETrue){} 错误编译
if(isLarger(43)){} 正确
2类象
21 Symbian系统中命名惯:
Symbian系统中编写代码时应遵守种样规:成员变量命名写字母i开头方法参数写字母a开头例:
class Pernon
{
public
TInt iAge
void SetAge(TInt aAge){iAge aAge}
}
symbian系统中存种类型类〔class〕类型类特性相
堆〔heap〕创立栈〔stack〕创立特类实例〔instance〕方式相〔面方便类类称型〕型〔class type〕表达特点型套定义关创立实例规容易区分型Symbian系统简单命名规:类名写字母开头〔TCR M〕作类设计者先考虑类行底种型匹配旦确定类型然专注该类功样类者讲果熟悉类 类命名规帮助弄清意图安方式初始化销毁类象〔object〕
面讨型特性
Ø T 类
T类行类似C++中置类型T作前缀(〞T〞代表〞Type〞)象置类型样没析构方法〔destructor〕导致结果:T类包含具析构方法成员变量般情况T类成员变量置类型数者T类象某情况T类包含象指针引时前〞关系拥〞关系〔说T类象负责成员创立销毁工作〕拥外部数原T类没析构方法正没析构方法T类象栈创立程序流程退出函数产生leave〔种代码异常〕时候系统动T类析构方法发生异常〔Symbian系统中异常称leave〕时Symbian 系统会调leave没模仿标准C++抛出异常做法
T类象堆创立应调发生异常代码前象放入栈〔cleanupStack〕发生异常时候栈〔cleanupStack〕会释放象
Ø C 类
种类CBase派生〔直接间接〕
h file
class CStudentpublic CBase
{
public
CStudent(){
RDebugPrint(_L(i am a student))
}
~CStudent()
{
RDebugPrint(_L(please don't kill me))
}
void SampleFunction(){}
private
TInt iCode
TInt iScore
}
CBase两特点:首先虚析构方法样通CBase指针删子类代码示:
CBase *pStu new CStudent()
delete pStu
结果: i am a student
please don't kill me
次CBase类子类重载new操作符堆创立时候动初始化0说开始创立出时候成员变量初始化0您必构造方法中做件事情栈创立象时情况非样 时没new操作潜导致堆创立象栈创立象行致C类象定堆创立
明显堆C类象需时需消耗 C类象两种方式存:类指针成员变量局部针指变量前种情况类析构方法中调delete删种情况复杂调潜异常〔leave〕代码前指针放栈〔cleanup stack〕中否发生存泄露CBase 类声明私拷贝构造方法赋值操作〔〕策略防止客户代码心浅拷贝赋值方法基类拷贝构造赋值私果您希您类够拷贝构造方法您必须显式声明定义拷贝构造方法赋值操作考虑C类特性深拷贝造成发生异常〔leave〕隐患您绝类构造方法〔析构方法〕发生异常〔教程面解释原〕果您确实需拷贝方法您类添加会发生异常方法完成样务例:CloneL()CopyL()果您提供类CBase派生您必防止客户代码潜安问题浅〞拷贝代码中方法声明私
Ø R 类
前缀R〞 里代表资源〔Resource〕 通常外部资源例:文件句柄〔handle〕
C类Symbian系统中存应RBase类R类应构造方法资源句柄置0说明没资源新建象关联起构造方法中初始化资源句柄样构造方法产生异常R类中常常类Open() Create() Initialize()样方法分配资源设置句柄成员变量值返回错误代码产生异常 R类通常应Close〔〕Reset()类释放资源重置句柄值说明没资源该象关联R类时常见错误忘记调Close()方法〔然该方法名字常命名Close〔〕〕析构方法释放资源会引起资源泄露
R类通常资源句柄没成员变量需通常没析构方法资源释放Close()方法中进行数情况R类作类成员变量局部变量存少数情况堆创立
您必须确保程序发异常时候资源正确释放通常资源栈果R类堆动变量〔相成员变量〕您保证资源释放变量身释放
typically by using two push calls CleanupClosePushL() or asimilar functionto ensure that the resource is cleaned up and a standard CleanupStackPushL(TAny*) which simply calls UserFree() on the heap cell
R类成员变量通常简单般需深拷贝〔bitwise copy〕R类拷贝会引起混乱〔想象:果两象时资源句柄调Close()方法两象没释放资源会发生什情况?〕果您想阻止R类拷贝您应声明〔定义〕私构造方法赋值操作
Ø M 类
提继承时候意味着类派生时混杂基类功前缀M单词Mixin首字母Symbian系统赞成继承做法引入额外复杂性M类抽象类作相java中接口〔interface〕Symbian系统中M 类常定义回调接口者观察者〔observer〕类M类类继承面出两例子
class MAnimal
{
public
virtual void EatL() 0
}
class MDomesticAnimal public MAnimal
{
public
virtual void NameL() 0
}
class CCat public CBase public MDomesticAnimal
{
public
virtual void EatL(){} MAnimal MDomesticAnimal继承
virtual void NameL(){} MDomesticAnimal继承
Other functions omitted for clarity
}
面例子演示CBase类M类派生具体类类MDomesticAnimalMAnimal派生象接口样实例化M类虚〔virtual〕函数成员变量构造方法析构方法 条件实现具体类必须CBase派生定义完类然代码:
CCat *cat1 new CCat
delete cat1 正确
然面代码错误
MAnimal *cat2 new CCat
delete cat1 错误
M类指针引象时候果delete删指针M类必须提供虚拟析构方法否会出现系统异常〔panic code 42〕MAnimal代码改写面代码没问题
class MAnimal
{
public
virtual void EatL() 0
virtual ~MAnimal() 增加虚析构方法
}
3描述符〔descriptor〕
Symbian 系统中字符串称描述符〞〔descriptor〕描述描述符中保存表示字符串长度底层存布局信息描述符标准C中字符数组字符指针复杂您需花时间学掌握法关键特殊设计少量存设备非常效率仅非常少存保存长度存布局信息现深入解描述符设计思想
Symbian系统中描述符相迷惑种类繁种类描述符具特性法常相互转换标准C++中stringjava语言中string类MFC中CString程序员必须理底层存分配工作具防治存溢出机制赖NULL终结符号决定字符串长度方讲C语言中字符串
现讨:什描述符?工作?探讨描述符前先需弄清楚根概念:什字符串数宽度〞长度指单字符8bit16bit宽度早期版中字符宽度8bit支持Unicode字符集第5版起Symbian系统16bit 字符作标 准Symbian系统现支持两种字符长度描述符Copy()Size()两方法外两种宽度描述符行完全致两方法面介绍外套中立描述符类型定义窄描述符类型定义宽描述符类型取决编译时宽度您名字容易出类型表示宽度假设8结尾〔例:TPtr8意味着表示8bit窄字符16结尾描述符类〔例:TPtr16〕操作16bit宽字符 中立〔neutral〕类型讲没数字结尾〔例:TPtr〕Symbian系统第5版默认情况表示宽度16bit字符串间关系拟类似TIntTInt16TInt32 间关系点应拟易理解
般情况您没必指明字符串宽度中立类型样代码易宽字符版窄字符版间转换〔编程验朋友应该样印象常写代码情况仅仅UINT类型较少考虑UINT16UINT32类型〕
外问题:描述符字面量〔literal〕区谓字面量指编码时候已确定量例标准C中
char* p Hello world
中Hello world字面量Symbian系统中处理样点面介绍
样认识 现描述符类型Symbian系统中描述符类型两种类:修改〔nonmodifiable〕描述符修改(modifiable)描述符
31修改〔nonmodifiable〕描述符
Symbian系统中描述符继承TDesC前面已讨类名前缀T代表意义里更关心类名缀C代表意义C单词Constant首字符表示类更改类提供返回字符串长度操作数方法Length〔〕方法返回描述符长度描述符象存中布局样4字节表示包含数长度〔实际32bit中28bit剩余4bit留作描述符表示长度228 字节256 MB已足够〕Length〔〕方法没子类重写子类效根实现子类方法子类访问数方式样Symbian系统求子类通虚函数方式实现访问数方法 虚函数重写原虚函数会派生描述符象增加4节字额外负担c++4字节存放指虚函数表指针前面说设计描述符时候高效额外字节开销认理想存放长度4字节中28bit表示长度剩4bit表示描述符类型目前symbian系统中5种派生描述符类型4bit限制描述符种类16种已足够子类通调基类TDesCPtr〔〕方法访问描述符数Ptr()方法检查4bit确定描述符类型返回数存中址然求TDesC基类清楚子类存布局Ptr〔〕方法中硬编码方法面表述方便种修改描述符称常量描述符〔constant descriptor〕
总结:修改描述符类TDesC非字面量描述符基类提供确定描述符长度访问数方法外实现您想处理常量字符串操作
32修改〔modifiable〕描述符
修改描述符TDes基类派生TDes身TDesC派生TDes额外成员变量存放该描述符分配数长度MaxLength()方法返回长度TDesC中Length〔〕方法样MaxLength()方法TDes子类继承 TDes类提供系列方法 修改字符串数操作包括字符串附加填充格式化操作方法派生类继承派生类实现特定构造方法复制赋值方法方法负责分配存假设超描述符数长度例Append〔〕方法某字符串面附加字符串时调该方法前您必须确保足够存空间然超描述符存储容量描述符长度伸缩描述符长度长度短时候描述符面局部余未方法断言〔assertion〕确保描述符长度会超出果发生存溢出会产生panic〔关panic面章节介绍〕样方便您检查修正程序错误
事实描述符溢出点保证您代码强壮性易产生难踪存陷阱
需注意基类构造方法proteced类型您法直接实例化TDesCTDes类实例现描述符派生类您实例化派生类象正前面说方拟迷惑描述符存量派生类 前面已解释什类会三版例:TDes8 TDes16 TDes分应窄字符宽字符中立类现描述符类型深入讨种类型细节前先考察般情况存布局描述符两种根存布局:指针描述符缓存区描述符处指针描述符持指字符串指针字符串存储存中基位置指针描述符缓存区描述符身持字符数说字符数身构成描述符局部
总结:TDes 修改描述符基类 TDesC派生返回存容量方法系列修改字符串数方法
33 指针描述符〔pointer descriptor〕
指针描述符分两种:TPtrC TPtr〔前面说种类型描述符字符宽度分三版例:窄字符版TPtrC8宽字窄版TPtrC16中立版TPtrC严格讲六种指针描述符〕指针描述符持字符串描述符身分开存放存储ROM中堆中栈中保存数存描述符拥通理果该描述符堆分配应通堆描述符〔HBufC面讲解〕操作存分配销毁果指针描述符指字符串栈分配存必须已栈分配通常情况指针描述符基栈时候堆例:作CBase派生类成员变量时候修改描述符〔TPtrC〕中指数指针存放长度面指针描述符总长度2字〔word〕修改指针描述符中存放长度面总长度3字列图拟TPtrTPtrC存布局
iLength(12)
iMaxLength
iPtr
Hello world
iLength(12)
iPtr
TPtrC
TPtr
Ø TPtrC
TPtrC相C语言中const char*指数访问修改:说描述符中数常量基类TDesC中继承操作访问TPtrC定义系列构造方法描述符指存指针0结尾C语言字符串构造
字面量描述符面介绍
_LIT(KLiteralDes Sixty zippers were quickly picked from the woven
jute bag)
TPtrC pangramPtr(KLiteralDes) 字面量描述符构造
TPtrC copyPtr(pangramPtr) 描述符构造
TBufC<100> constBuffer(KLiteralDes) 常量缓存区描述符面介绍
TPtrC ptr(constBuffer) Constructed from a TBufC
TText8 is a single (8bit) character equivalent to unsigned char
const TText8* cString (TText8*)Waltz bad nymph for quick jigs
vex
0结尾字符串构造
TPtrC8 anotherPtr(cString)
TUint8* memoryLocation Pointer into memory initialized elsewhere
TInt length Length of memory to be represented
TPtrC8 memPtr(memoryLocationlength) 指针构造
指针身改变成指字符串数(通Set〔〕方法)果您想指明改变您TPtrC指数您TPtrC声明const样您试图Set〔〕方法更改TPtrC指数时编译器会产生警告
字面量描述符
_LIT(KLiteralDes1 Sixty zippers were quickly picked from the woven jute
bag)
_LIT(KLiteralDes2 Waltz bad nymph for quick jigs vex)
TPtrC alpha(KLiteralDes1)
TPtrC beta(KLiteralDes2)
alphaSet(KLiteralDes2) alpha points to the data in KLiteralDes2
betaSet(KLiteralDes1) beta points to the data in KLiteralDes1
const TPtrC gamma(beta) Points to the data in beta KLiteralDes1
gammaSet(alpha) Generates a warning but points to alpha
里应加示范代码
Ø TPtr
TPtr 修改指针描述符访问修改字符串二进制数TDesC TDes提供操作适TPtr类定义构造方法指存指针构造设置适长度值长度值
编译器会产生隐式构造方法拷贝构造方法没声明保护私TPtr象修改描述符构造例:通修改描述符调Des〔〕方法方法返回示TPtr象:
_LIT(KLiteralDes1 Jackdaws love my big sphinx of quartz)
TBufC<60> buf(KLiteralDes1) TBufC are described later
TPtr ptr(bufDes()) Copy construction can modify the data in buf
TInt length ptrLength() Length 37
TInt maxLength ptrMaxLength() Maximum length 60 as for buf
TUint8* memoryLocation Valid pointer into memory
TInt len 12 Length of data to be represented
TInt maxLen 32 Maximum length to be represented
Construct a pointer descriptor from a pointer into memory
TPtr8 memPtr(memoryLocation maxLen) length 0 max length 32
TPtr8 memPtr2(memoryLocation len maxLen) length 12 max 32
外TPtr提供赋值运算符()拷贝数指针指存〔数源修改修改指针描述符0结尾字符串〕果拷贝数长度超描述符长度会引发系统异常TPtrC样TPtr定义Set〔〕方法改变描述符指数
_LIT(KLiteralDes1 Jackdaws love my big sphinx of quartz)
TBufC<60> buf(KLiteralDes1) TBufC are described later
TPtr ptr(bufDes()) Points to the contents of buf
TUint16* memoryLocation Valid pointer into memory
TInt maxLen 40 Maximum length to be represented
TPtr memPtr(memoryLocation maxLen) length 12 max length 40
Copy and replace
memPtr ptr memPtr data is KLiteralDes1 (37 bytes) maxLength 40
_LIT(KLiteralDes2 The quick brown fox jumps over the lazy dog)
TBufC<100> buf2(KLiteralDes2) TBufC are described later
TPtr ptr2(buf2Des()) Points to the data in buf
Replace what ptr points to
ptrSet(ptr2) ptr points to contents of buf2 max length 100
memPtr ptr2 Attempt to update memPtr which panics because the
contents of ptr2 (43 bytes) exceeds max length of memPtr (40 bytes)
您定混淆Set〔〕方法()赋值操作前者描述符指针重置指新数区域者数拷贝描述符中般说会更改描述符长度会更改长度值
35 基栈〔stackbased〕缓区描述符
基缓区描述符分修改TBuf修改TBufC两种类型种描述符讲字符串数身描述符局部列图出描述符存布局:
iLength 12
iMaxLength
Hello World
TBuf<15>
iLength 12
Hello World
TBufC<12>
两种描述符通常存储定长相较字符串常存放长度256字符文件名类似C语言中char[]具检查存溢出功
Ø TBufC
TBufC
该描述符数修改整容置换〔通该类定义赋值操作〕置换数修改描述符0结尾字符串种情况新数长度超长度n〔创立该类时候指定模板参数〕
_LIT(KPalindrome Satan oscillate my metallic sonatas)
TBufC<50> buf1(KPalindrome) Constructed from literal descriptor
TBufC<50> buf2(buf1) Constructed from buf1
Constructed from a NULLterminated C string
TBufC<30> buf3((TText*)Never odd or even)
TBufC<50> buf4 Constructed empty length 0
Copy and replace
buf4 buf1 buf4 contains data copied from buf1 length modified
buf1 buf3 buf1 contains data copied from buf3 length modified
buf3 buf2 Panic Max length of buf3 is insufficient for buf2 data
该描述符中数整体置换直接修改时候确实需修改缓存区中数该办呢?系统提供种途径修改数该类定义Des〔〕方法缓存区中数返回修改指针描述符〔TPtr〕通指针描述符间接修改缓区中数数通指针描述符修改指针描述符缓区描述符中iLength值会着改变记住缓存区描述符长度值减增描述符类提供存理理功
_LIT8(KPalindrome Satan oscillate my metallic sonatas)
TBufC8<40> buf(KPalindrome) Constructed from literal descriptor
TPtr8 ptr(bufDes()) data is the string in buf max length 40
Illustrates the use of ptr to copy and replace contents of buf
ptr (TText8*)Do Geese see God
ASSERT(ptrLength()bufLength())
_LIT8(KPalindrome2 Are we not drawn onward we few drawn onward to
new era)
ptr KPalindrome2 Panic KPalindrome2 exceeds max length of ptr(40)
Ø TBuf
模板类修改缓区描述符类面
果需动态分配存您基堆描述符面讲您觉理存分配务太繁重您选择动态数组您应记住动态数组额外开销高
_LIT(KPalindrome Satan oscillate my metallic sonatas)
TBuf<40> buf1(KPalindrome) Constructed from literal descriptor
TBuf<40> buf2(buf1) Constructed from constant buffer descriptor
TBuf8<40> buf3((TText8*)Do Geese see God) from C string
TBuf<40> buf4 Constructed empty length 0 maximum length 40
Illustrate copy and replace
buf4 buf2 buf2 copied into buf4 updating length and max length
buf3 (TText8*)Murder for a jar of red rum updated from C string
36 基堆〔HeapBased〕缓区描述符
您非常长字符串时外种选择:基堆描述符拥创立者更长生存期您编译时候确定缓区长度时候堆描述符时作相C语言中malloc
Ø HBufC
许您已发现HBufC类名H〞开头符合Symbian系统中惯命名惯确实特例H〞表示类般堆〔Heap〕分配HBufC定义静态NewL〔〕方法堆创立缓存区正您见HBufC中字母C〞表示表述符修改该类操作TBufC
_LIT(KPalindrome Do Geese see God)
TBufC<20> stackBuf(KPalindrome)
Allocates an empty heap descriptor of max length 20
HBufC* heapBuf HBufCNewLC(20)
TInt length heapBuf>Length() Current length 0
TPtr ptr(heapBuf>Des()) Modification of the heap descriptor
ptr stackBuf Copies stackBuf contents into heapBuf
length heapBuf>Length() length 17
HBufC* heapBuf2 stackBufAllocLC() From stack buffer
length heapBuf2>Length() length 17
_LIT(KPalindrome2 Palindrome)
*heapBuf2 KPalindrome2 Copy and replace data in heapBuf2
length heapBuf2>Length() length 10
CleanupStackPopAndDestroy(2 heapBuf)
记住堆描述符您求尺寸动态分配存会动您期更改缓区修改缓存区 容前您确保缓存区存足够帮您简化操作HBufC提供套ReAllocL()方法扩展堆缓存区〔操作会缓区存区域搬区域〕
If the HBufC* is stored on the cleanup stack moving the pointer as a result of memory reallocation can cause signicant problems either in the event of a leave or if the cleanup stack’s PopAndDestroy() function is used to destroy
the memory
果您HBufC调Des()方法获取TPtr 重新分配存TPtr中成员变量iPtr变成效确保安重新分配存应该次调Des〔〕创立新TPtr象
注:出性考虑Symbian系统没提供修改堆描述符HBuf
总结:Symbian系统中总5种类型描述符TPtrCPTtrTBufC
37字面量描述符〔Literal Descriptors〕
面字面量描述符相C语言中static char[]字面量描述符通系列宏创立宏头文件e32defH中找
#define _L8(a) (TPtrC8((const TText8 *)(a)))
#define _S8(a) ((const TText8 *)a)
#define _LIT8(names) const static TLitC8
name {sizeof(s)1s}
#define _L16(a) (TPtrC16((const TText16 *)L ## a))
#define _S16(a) ((const TText16 *)L ## a)
#define _LIT16(names) const static TLitC16
name {sizeof(L##s)21L##s}
首先_LIT效率宏法:
_LIT(KMyLiteralDescriptor The quick brown fox jumps over the lazy dog)
面KMyLiteralDescriptor作常量例写文件显示户_LIT 宏构建名KMyLiteralDescriptorTLitC16象中保存字符串值〔例子中The quick brown fox jumps over the lazy dog〕二进制程序中找值写文件中您料_LIT8_LIT16法相似描述符宽度16bitC字节类型字符串转换描述符数时宏字符串长度2
作参考面出类TLitC16定义中__TText定义宽16bit字符TLitC8
类似定义
template
class TLitC16
{
public
inline const TDesC16* operator&() const
inline operator const TDesC16&() const
inline const TDesC16& operator()() const
Omitted for clarity
public
TUint iTypeLength
__TText iBuf[__Align16(S)]
}
template
inline const TDesC16* TLitC16
{return REINTERPRET_CAST(const TDesC16*this)}
template
inline const TDesC16& TLitC16
{return *operator&()}
template
inline TLitC16
{return *operator&()}
面定义中 TLitC16 (TLitC8) TDesC8 TDesC16派生TBufC8 TBufC16具相存布局TLitC16 (TLitC8)TDesC方您方法字面量构造指针描述符:
TPtrC8 thePtr(KMyLiteralDescriptor)
字面量构造缓区描述符需点技巧果您size〔〕获_LIT常量会返回相应TLitC象尺寸尺寸相描述符容尺寸加额外8byte〔存放长度值4字节表示结束符NULL〕果您想构造基堆描述符必须额外8字节考虑进
定义包含44字符字面量
_LIT8(KExampleLit8 The quick brown fox jumped over the lazy dog)
TInt size sizeof(KExampleLit8) 52 bytes (contents + 8 bytes)
TBufC8<(sizeof(KExampleLit8)8)> theStackBuffer(KExampleLit8)
基堆描述符您描述符实际容长度分配缓区然容拷贝描述符中正确长度您公〔public〕成员变量iTypeLength者更简单方法〔〕操作符字面量转换成描述符然描述符容长度简单方法〔〕操作符象转换成描述符直接调TDesAllocL()方法返回HBufC*代码:
TInt descriptorLength KExampleLit8iTypeLength 44 bytes
Form a stack buffer descriptor around the literal
Create a heap buffer copying the contents of the literal
HBufC8* theHeapBuffer KExampleLit8()AllocL()
宽字符字面量操作类似
_LIT16(KExampleLit16 The quick brown fox jumped over the lazy dog)
size sizeof(KExampleLit16) 96 bytes (contents in bytes + 8 bytes)
descriptorLength KExampleLit16iTypeLength 44 bytes (contents)
_L _LIT生成字面量存布局差异列图示:
现简单 _L _S 宏 两宏已时 测试代码中常
RDebugPrint(_L(Hello world))
代码作相:
_LIT(KLitHello world)
RDebugPrint(KLit)
面代码_L处您直接需前方声明字符串(〞Hello world〞)作根0结尾字符串写二进制文件中前面没长度值(_LIT产生字符串)没长度值字面量存布局描述符代码运行时候_L第实例会产生时TPtrCTPtrC指针指字面量第字节ROM中存储位置创立该字面量生存期中时描述符安然创立时变量求设置指针长度描述符类型联构造方法说负担果代码中样字面量会二进制程序体积增果仅存储方式_S 宏_L相 点产生时TPtrC描述符果您仅作0结尾描述符_S宏
目前止已讨关描述符根知识包括实例化种具体描述符访问修改描述符数置换描述符容现关注操作数方法描述符时常见问题
38描述符作参数返回类型
编写代码时候您想限制TBuf原仅仅某特定库函数求样道理作函数提供者您调者传递进参数类型感兴趣事实您应该求调者传递特定类型参数您面修改函数实现您改变描述符类型果您样函数作编程接口您您客户改变代码样改动非常理想破坏代码兼容性
非您掌描述符〔负责描述符创立销毁工作〕您甚知道描述符基堆基栈事实标准类型描述符〔前面提5种描述符类型〕面调适方法客户代码完全忽略描述符存布局存中位置基原您定义函数时候应量抽象基类作函数参数返回值效率描述符参数应引传递方式const TDesC&者TDes&
例类RFile定义read〔〕write〔〕方法
IMPORT_C TInt Write(const TDesC8& aDes)
IMPORT_C TInt Read(TDes8& aDes) const
两方法中输入描述符显式声明8bit宽度样写入字符串写入二进制数写入文件中参数修改描述符引读文件时候修改描述符引修改描述符长度决定文件中读入少数需文件效劳器传递表示长度参数文件效劳器会填充满描述符文件中数够描述符长度时文件效劳器会数写入描述符调函数描述符长度反映写入数长度样调者需外传递参数表示返回数长度
写函数时候 果参数修改描述符实际您必考虑否足够空间存放数描述符身边界检查机制果出现存溢出现象会产生系统异常
然您希描述符数区短情况描述符方法会发生系统异常时您应文档中说明果描述符长度够会处理时候拟方法调者返回长度值样调者采适步骤分配正确长度描述符
HBufC* CPoemDoGetLineL(TInt aLineNumber)
{ Code omitted for clarity Allocates and returns a heap buffer
containing the text of aLineNumber (leaves if aLineNumber is
out of range)
}
void CPoemGetLineL(TInt aLineNumber TDes& aDes)
{
HBufC* line DoGetLineL(aLineNumber)
CleanupStackPushL(line)
Is the descriptor large enough (4 bytes or more) to return an
integer representing the length of data required
if (aDesMaxLength() < line>Length())
{
if (aDesMaxLength() > sizeof(TInt))
{ Writes the length required (TPckg is described later)
TPckg
aDesCopy(length)
}
Leave & indicate that the current length is too short
UserLeave(KErrOverflow) Leaves are described in Chapter 2
}
else
{
aDesCopy(*line)
CleanupStackPopAndDestroy(line)
}
}
方案函数中分配堆缓区返调者调者负责销毁
39常方法
Ø Ptr()
基类TDesC 实现Ptr()方法访问描述符数该方法返回指字符数组首址指针您通指针直接操作字符串数 代码示:
Ø Size() Length()
TDesC 实现 Size() and Length() 方法 前者返回描述符占字节数者返回描述符字符长度8bit描述符讲相等16bit描述说Size() 返回数值 Length() 两倍
Ø MaxLength()
修改描述符TDes实现方法返回描述符长度
Ø SetLength()SetMax()
前者设置描述符长度长度值必须描述符长度否会引起系统异常者描述符前长度设置成值注意扩展描述符数区长度
Ø Zero()FillZ()
前者描述符长度设置0者0填充描述符容置果您字符填充描述符容Fill()方法方案类似C语言中memset〔〕函数
Ø Copy()
TDes 实现系列重Copy() 方法 面中两:
IMPORT_C void Copy(const TDesC8 &aDes)
IMPORT_C void Copy(const TDesC16 &aDes)
方法参数描述符中数拷贝目标描述符中时目标描述符设置新长度源描述符长度超目标描述符长度会引发系统异常
310 HBufC 堆描述符
已讨描述符特性现关注描述符时常容易范错误
首先创立堆描述符HBufC前面提已描述符调Alloc〔〕AllocL〔〕方法产生新HBufC里例子:
void CSampleClassUnnecessaryCodeL(const TDesC& aDes)
{
iHeapBuffer HBufCNewL(aDesLength())
TPtr ptr(iHeapBuffer>Des())
ptrCopy(aDes)
代码完全面代面代码更效率
iHeapBuffer aDesAllocL()
}
Another common way to introduce complexity occurs in the opposite
direction that is the generation of TDesC& from a heap descriptor
堆描述符产生TDesC&时候容易范错误错误样代码增加复杂性代码示:
const TDesC& CSampleClassMoreAccidentalComplexity()
{
return (iHeapBuffer>Des())
代码完全写成
return (*iHeapBuffer) 样更简洁高效
}
外拟微妙问题您分配HBufC然面调Des〔〕返回TPtr象
HBufC* buf = HBufCNewL(9)
TPtr p buf>Des()
假设您回忆知道HBufC中没字〔word〕保存长度信息HBufC修改(nonmodifiable)需长度信息然TPtr需长度信息时问题您里长度呢?答案:您调Des()时候系统HBufC长度设置TPtr长度〔iMaxLength〕
例子中buf长度少呢?9?答案定堆描述符长度您期值〔例子中9〕您没指定字齐〔wordaligned〕长度实际长度您指定长度(确定值底少)
_LIT(KPanic TestPointer)
const TInt KBufferLength 9
void TestPointer()
{ Create a buffer with length KBufferLength 9 bytes
HBufC8* myBuffer HBufC8NewMaxL(KBufferLength)
TPtr8 myPtr(myBuffer>Des())
TInt len myPtrLength() len值0
TInt maxLen myPtrMaxLength() KBufferLength稍数固定
myPtrSetLength(KBufferLength) myPtrSetMax()否面语句起作
myPtrFill(’’) ’’填充描述符
char* ptr 〔char*)myPtrPtr()确保已调SetLength()SetMax()方法
ptr[0] 'x'
HBufC8* buf HBufC8NewLC(9)
TPtr8 ptr(buf>Des())
TInt maxLength ptrMaxLength() maxLength9定等12〔字边界〕
311 TFileName滥
TFileName 象滥潜危险TFileName文件 e32stdH中定义
const TInt KMaxFileName0x100 256 (decimal)
typedef TBuf
宽字符相两字节〔前面说默认情况TBuf16bit宽度〕 文件名长度少次您栈创立TFileName 象时候消耗524 字节 (2 × 256 描述符数字节 + 描述符身12字节)Symbian OS系统中标准栈空间8K字节必限资源非常浪费量基栈TFileName 象值传递方式应引传递方式您堆方您作C类〔CBase派生类〕成员变量果您需完整路径HBufC存放文件名量少资源总
您TParse 类(f32fileH中定义)类保存描述符拷贝拷贝中包含解析文件名拷贝会掉珍贵栈空间您应考虑TParsePtr TParsePtrC 类提供样功拷贝文件名仅仅保存文件名引
4辅助类
讨普遍问题章结尾两常辅助类
41 TLex〔TLex8TLex16〕类
描述符样TLex8bit16bit两种版分TLex8 and TLex16般情况应TLex需指定特定版该类实现般目词法分析语法成分解析字符串数字转换功面该类提供方法:
42 Pckg类
外套辅助类分:TPckgBufTPckgTPckgC分派生TBuf
包类〔package class〕方便扁〔flat〕数象存储描述符中跨线程跨进程数享时候 实际T类象完整包描述符中样容易种类型安方式线程间享
两种Package指针类:TPckgTPckgC分应修改修改类型持指包装象指针
class TSample
{
public
void SampleFunction()
void ConstantSampleFunction() const
private
TInt iSampleData
}
TSample theSample
TPckg
TPckgC
例子中TPckg
包象调〔〕方法返回包装象引代码:
packagePtr()SampleFunction() 合法
packagePtrC()SampleFunction()编译错误调const方法
packagePtrC()ConstantSampleFunction()合法
TPckgBuf类创立存储新包装类型实例〔注意窗建新实例保存指针〕 TPckgBuf理拷贝象TPckgBuf象调〔〕方法返回拷贝引然引调方法TPckgBuf象拥拷贝修改代码:
TPckgBuf
packageBuf()SampleFunction()
TPckgBuf拥原始数拷贝果面调修改成员变量方法修改拷贝数原数受影响〔类似函数调时值传递方式〕
面图示说明存布局:
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档