bambooflow Note

ディスクリプタ

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

ディスクリプタ


Symbian OSでディスクリプタ(descriptor)とは、文字列を扱うためのクラス一群のことを呼ぶ。(バイナリも)
文字列操作は標準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から派生して作ることはできない。

e32des16.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
記事メニュー
ウィキ募集バナー