近来在家中休息,想整理一下自己的笔记,还是从基本的开始吧
缓冲区描述符
TBufC //e32cmn.h
基本用法
_LIT(KText1,"Hello World\n");
TBufC<30> bufText1;
bufText1 = KText1; //这个“=”已经被重载过了
console->Write(bufText1);
_LIT(KText2,"Hello World\n");
TBufC<30> bufText2(KText2);
console->Write(bufText2);
类函数
template <TInt S>
#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
class TBufC : public TBufCBase16
#else
class TBufC : public TBufCBase8
#endif
{
public:
inline TBufC();
inline TBufC(const TText* aString);
inline TBufC(const TDesC& aDes);
inline TBufC<S>& operator=(const TText* aString); //这个“=”已经被重载过了
inline TBufC<S>& operator=(const TDesC& aDes); //这个“=”已经被重载过了
inline TPtr Des();
private:
TText iBuf[__Align(S)];
};
//拷贝构造函数和默认的重载操作符
TBufC(const TBufC<S>& buf);
TBufC<S>& operator = (const TBufC<S>& aBuf);
TBuf //e32cmn.h
基本用法
_LIT(KText,"YunYun\n");
TBuf<100> buf;
buf.Copy(KText);
console->Write(buf);
TBufC<30> bufText(KText);
buf.Copy(bufText);
console->Write(buf);
buf.Zero();
buf.AppendFormat(_L("this is a TBuf example,%S"),&KText);
buf.AppendFormat(_L("++_ %S"),&bufText);
console->Write(buf);
//也可以用 = ,但是那样多了一个32位的最大长度iMaxLength,不好
使用方法基本跟TBufC相同,在栈上分配空间,直接声明使用
修改方法都是从TDes中继承的
类函数
template <TInt S>
#if defined(_UNICODE) && !defined(__KERNEL_MODE__)
class TBuf : public TBufBase16
#else
class TBuf : public TBufBase8
#endif
{
public:
inline TBuf();
inline explicit TBuf(TInt aLength); //explicit 不能被隐式转换
inline TBuf(const TText* aString);
inline TBuf(const TDesC& aDes);
inline TBuf<S>& operator=(const TText* aString);
inline TBuf<S>& operator=(const TDesC& aDes);
inline TBuf<S>& operator=(const TBuf<S>& aBuf);
private:
TText iBuf[__Align(S)];
};
指针描述符
TPtrC //e32des16.h
//iPtr存放指向buffer的指针
基本用法
_LIT(KText,"YunYun\n");
TBuf<100> buf;
buf.Copy(KText);
TPtrC ptrc1 = buf.Left(3);
TPtrC ptrc2(ptrc1);
TPtrC ptrc3;
ptrc3.Set(buf);
console->Write(ptrc1);
console->Write(ptrc2);
console->Write(ptrc3);
类函数
class TPtrC16 : public TDesC16
{
public:
//构造函数,第一种给TPtrC设置缓冲区的方法
IMPORT_C TPtrC16();
IMPORT_C TPtrC16(const TDesC16 &aDes);
IMPORT_C TPtrC16(const TUint16 *aString); //以“0”结尾的字符串指针
IMPORT_C TPtrC16(const TUint16 *aBuf,TInt aLength); //传递一个缓冲区的指针,设置TPtrC对象的长度
//默认的拷贝构造函数
TPtrC(const TPrtC &aDes);
//可以通过set方法设置缓冲区,第二种给TPtrC设置缓冲区的方法
inline void Set(const TUint16 *aBuf,TInt aLength);
inline void Set(const TDesC16 &aDes);
inline void Set(const TPtrC16 &aPtr);
//Set方法不能改变缓冲区里面的数据,但是可以改变TPtrC对象指向的缓冲区
private:
TPtrC16& operator=(const TPtrC16 &aDes); //TPtrC也重载了“=”
protected:
const TUint16 *iPtr;
private:
__DECLARE_TEST;
};
第三种给TPtrC设置缓冲区的方法,直接通过其他缓冲区描述符获取TPtrC对象
_LIT(KText1,"YunYun\n");
TBuf<100> bufText1;
bufText1.Copy(KText1);
TPtrC ptrcLeft = bufText1.Left(3);
TPtrC ptrcRight;
ptrcRight.Set(bufText1.Right(4));
TPtr //e32des16.h
基本用法
_LIT(KText1,"YunYun\n");
TBufC<100> bufText1;
bufText1 = KText1;
_LIT(KText2,"YunYun");
TBufC<30> bufText2(KText2);
TPtr ptr = bufText1.Des(); //变成Ptr型的
ptr.Set(bufText2.Des());
ptr.AppendFormat(_L(" %d"),20);
console->Write(ptr);
//通过指针描述符轻松的绕过了TBufC的不能修改的限制
//还可以用这个
TText text[100];
TPtr ptrText(text,100);
类方法
class TPtr16 : public TDes16
{
public:
//注意没有空的构造函数
IMPORT_C TPtr16(TUint16 *aBuf,TInt aMaxLength);
IMPORT_C TPtr16(TUint16 *aBuf,TInt aLength,TInt aMaxLength);
//拷贝构造函数
TPtr(TPtr& aTPtr);
//重载的“=”运算符
inline TPtr16& operator=(const TUint16 *aString);
inline TPtr16& operator=(const TDesC16& aDes);
inline TPtr16& operator=(const TPtr16& aDes);
inline void Set(TUint16 *aBuf,TInt aLength,TInt aMaxLength);
inline void Set(const TPtr16 &aPtr);
private:
IMPORT_C TPtr16(TBufCBase16 &aLcb,TInt aMaxLength); //注意这个是一个私有的方法
protected:
TUint16 *iPtr;
private:
friend class TBufCBase16;
__DECLARE_TEST;
};
实际开发过程中,很多时候是直接取得指向缓存区的指针描述符TPtr对象,然后使用TPtr对象操作缓冲区中的数据,常用的方法有下面两种
1)取得TBufC的指针描述符
_LIT(KText2,"YunYun");
TBufC<30> bufText2(KText2);
TPtr ptr = bufText1.Des(); //变成Ptr型的
2)取得缓冲区描述符HBufC的指针描述符
HBufC* pBuf = HBufC::New(30);
TPtr ptrBuf = pBuf->Des(); //注意堆是->,TBufC是.
堆缓冲区描述符
HBufC
在堆上,要用New方法
class RReadStream;
class HBufC16 : public TBufCBase16
{
public:
IMPORT_C static HBufC16 *New(TInt aMaxLength);
IMPORT_C static HBufC16 *NewL(TInt aMaxLength);
IMPORT_C static HBufC16 *NewLC(TInt aMaxLength);
IMPORT_C static HBufC16 *NewMax(TInt aMaxLength);
IMPORT_C static HBufC16 *NewMaxL(TInt aMaxLength);
IMPORT_C static HBufC16 *NewMaxLC(TInt aMaxLength);
IMPORT_C static HBufC16 *NewL(RReadStream &aStream,TInt aMaxLength);
IMPORT_C static HBufC16 *NewLC(RReadStream &aStream,TInt aMaxLength);
//也重载了“=”操作符
IMPORT_C HBufC16& operator=(const TUint16 *aString);
IMPORT_C HBufC16& operator=(const TDesC16 &aDes);
inline HBufC16& operator=(const HBufC16 &aLcb);
IMPORT_C HBufC16 *ReAlloc(TInt aMaxLength); //失败返回NULL,且原来的buffer的内容不变
IMPORT_C HBufC16 *ReAllocL(TInt aMaxLength); //失败返回Leave。且原来的buffer的内容不变
IMPORT_C TPtr16 Des();
private:
inline HBufC16(TInt aLength);
private:
TText16 iBuf[1];
__DECLARE_TEST;
};
注意:
一旦重新分配,必须改变指向原来buffer的指针的指向,包括cleanup stack中的指针
HBufC* buf = HBufC::New(15);
CleanupStack::PushL(buf);
_LIT(KText,"YunYun\n");
*buf = KText;
console->Write(*buf);
buf = buf->ReAlloc(20);
CleanupStack::Pop(buf);
CleanupStack::PushL(buf);
_LIT(KRepText,"&YunYun&&YunYun&\n");
*buf = KRepText;
console->Write(*buf);
CleanupStack::PopAndDestroy(buf);