ディスクリプタ
Symbian OSでディスクリプタ(descriptor)とは、文字列を扱うためのクラス一群のことを呼ぶ。(バイナリも)
文字列操作は標準Cの文字列処理機能は使わずにディスクリプタを使う。
文字列操作は標準Cの文字列処理機能は使わずにディスクリプタを使う。
ディスクリプタの分類
- リテラルディスクリプタ/プログラムバイナリディスクリプタ
- (TDesCを継承していないので正しくはディスクリプタではない)
- スタティックディスクリプタ
- ポインタディスクリプタ
- ヒープディスクリプタ
ディスクリプタの型
型 | 定数 | 名前 | Cとの比較 |
リテラル | 変更不可 | TLitC | static const char [ ] |
スタック | 変更可能 | TBuf | char [ ] |
直接変更不可 | TBufC | const char [ ] | |
ポインタ | 変更可能 | TPtr | char* |
変更不可 | TPtrC | const char* | |
ヒープ | 変更可能 | RBuf | char*(new) |
直接変更不可 | HBufC | const char*(new) |
ディスクリプタの継承
ディスクリプタは基底ディスクリプタクラスTDesCを継承する。
- TDesC <-- TDes <-- TBufBase <-- TBuf
- TDesC <-- TDes <-- TPtr
- TDesC <-- TDes <-- RBuf
- TDesC <-- TPtrC
- TDesC <-- TBufCBase <-- TBufC
- TDesC <-- TBufCBase <-- HBufC
ここで、TDesC、TDes、TBufBase、TBufCBaseは抽象クラス。ただし、ここでいう抽象クラスはC++のいうところの純粋仮想メソッドをもつクラスではなく、実体化を意図しないという意味をさす。
独自のディスクリプタをTDesCから派生して作ることはできない。
独自のディスクリプタをTDesCから派生して作ることはできない。
e32des16.h
e32des8.h
e32cmn.h
あたり参照。
e32des8.h
e32cmn.h
あたり参照。
リテラル
リテラル文字列を扱うときは、_LITマクロを使用する。(TLitCクラスを直接使用することはない)
Symbian OSでは、
_LIT( TextData, "Hello World" );
_LITマクロは、標準Cではいうところで次と類似する。
static const char TextData[] = "Hello World";
_Lの利用は旧式。ただ、まだ利用されているケースがある。
_L、_S、_LITは、e32def.hの中で定義されている。
注意としてヘッダファイル内でリテラルを宣言しない。
#if defined(_UNICODE) && !defined(__KERNEL_MODE__) #define _L(a) (TPtrC((const TText *)L ## a)) #define _S(a) ((const TText *)L ## a) #define _LIT(name,s) const static TLitC<sizeof(L##s)/2> name={sizeof(L##s)/2-1,L##s} #else #define _L(a) (TPtrC((const TText *)(a))) #define _S(a) ((const TText *)a) #define _LIT(name,s) const static TLitC<sizeof(s)> name={sizeof(s)-1,s} #endif