Symbianプログラミング-集合とバッファ(1)-RArrayとRPointerArray


Symbian OSはSTLをサポートしていません.主な理由は、STLがカバーされている面が広く、メモリが制限されているデバイスで使用するのに適していないためです.
ここではまずRArrayテンプレートクラスについて学びます.Javaまたは.netの経験がある場合は、SymbianのRArrayおよびRPointerArrayはjavaのVector<>または.netのList<>に似ています.
注意事項:
  • RArrayおよびRPointerArrayは、テンプレートベースの
  • です.
  • RArrayのテンプレートパラメータはRクラスまたはTクラスであるべきであり、RPointerArrayのテンプレートパラメータは任意のタイプの
  • であることができる.
  • RArrayは固定長オブジェクトの集合(最小長4バイト、オブジェクトのsizeofは>4!)であり、RPointerArrayはオブジェクトポインタの集合
  • である.
  • RArrayとRPointerArrayはスタックに作成するか、Cクラスのメンバー変数
  • に作成する必要があります.
    次に、RArrayとRPointerArrayのいくつかの一般的な方法について説明します.以下のすべてのプレゼンテーションコードはコンソールプログラムで実行されます.
    一、常用方法
    1、[]オペレータ
    RArrayは[]オペレータを再ロードしました:
    inline const T &operator[](TInt anIndex) const; inline T &operator[](TInt anIndex);

    2、要素の追加、AppendとAppendL方法:まず、ブレークコードを使用してAppend(L)の使用方法を説明します.
    _LIT(KText1, "Hello world 1"); _LIT(KText2, "Hello world 2"); RArray<TDesC> array; array.Append(KText1()); array.Append(KText2()); console->Write(array[0]); array.Reset(); array.Close(); 

    私たちの理解では、コンソールが出力するのは「Hello World 1」であるべきですが、実際にはコンソールが出力するのは文字化けしています.なぜですか.
    上記の注意点の3つ目は、「RArrayは固定長オブジェクトの集合」であり、テンプレートパラメータの長さはRArray構築時に決定されるが、TDesCタイプの長さは明らかに可変である(TDesCは記述子のベースクラスであり、記述子の派生クラスの長さは含む内容に基づいて変化する)ため、ここでは正確な結果は得られない.
    RArrayを作成するときに記述子のサイズを決定すればよいので、2つの方法があります.
    _LIT(KText1, "Hello world 1"); _LIT(KText2, "Hello world 2"); RArray<TPtrC> array; array.Append(KText1()); array.Append(KText2()); console->Write(array[0]); array.Reset(); array.Close(); 

    または
    typedef TBufC<20> TBufParam; _LIT(KText1, "Hello world 1"); _LIT(KText2, "Hello world 2"); RArray<TBufParam> array; array.Append(KText1()); array.Append(KText2()); console->Write(array[0]); array.Reset(); array.Close(); 

    3、並べ替え、Sort方法
    .netでは、ソートメソッドを実装するには、入力した2つの変数を比較し、比較後の値をソートメソッドに返す依頼を実装する必要があります.
    Symbian OSでは、TLinearOrderオブジェクトを使用して関数ポインタを使用して比較関数をバインドするメカニズムが似ています.この関数は、RArrayのSortメソッド内でこのTLinearOrderオブジェクトに転送される静的関数、グローバル関数、またはネーミングスペースの関数でなければなりません.
    TInt CompareTPtrC(const TPtrC& aLeft, const TPtrC& aRight) { return aLeft.Compare(aRight); } LOCAL_C void MainL() { _LIT(KText1, "Hello world 2"); _LIT(KText2, "Hello world 1"); RArray<TPtrC> array; array.Append(KText1()); array.Append(KText2()); TLinearOrder<TPtrC> order(CompareTPtrC); array.Sort(order); console->Write(array[0]); array.Reset(); array.Close(); }

    ソート後、返される結果は「Hello world 1」
    4、検索
    検索はソートと同様に、2つの変数が同じかどうかを判断するために1つの依頼を実現します.今回はTIdentityRelationクラスを使用して比較関数をカプセル化します.同様に、この比較関数は静的関数、グローバル関数、またはネーミングスペースの関数でなければなりません.
    RArray::Findメソッドの最初のパラメータは検索対象のオブジェクトで、2番目のパラメータは比較関数をカプセル化したTIdentityRelationオブジェクトです.
    TBool CompareTPtrC(const TPtrC& aLeft, const TPtrC& aRight) { return aLeft.Compare(aRight) == 0 ? ETrue : EFalse; } LOCAL_C void MainL() { _LIT(KText1, "Hello world 2"); _LIT(KText2, "Hello world 1"); RArray<TPtrC> array; array.Append(KText1()); array.Append(KText2()); TIdentityRelation<TPtrC> relation(CompareTPtrC); TPtrC ptr(_L("Hello world 1")); TInt index = array.Find(ptr, relation); console->Write(array[index]); array.Reset(); array.Close(); } 

    二、集合使用時のメモリ管理問題
  • RArrayクラスを使用する場合、テンプレートオブジェクトが占めるバイトは>=4バイトでなければなりません.次のコードは重大な例外を引き起こします.
    class TTestClass { public: TUint8 iX; TUint8 iY; }; RArray<TTestClass> iArray; LOCAL_C void MainL() { TTestClass testClass1; iArray.Append(testClass1); } 
  • RArrayとRPointerArrayがRクラスであるため、RクラスはいずれもCloseメソッドを呼び出してハンドル解放リソースを閉じる必要があるため、異常終了時にプログラムが自動的にCloseメソッド
  • を呼び出すには、CleanupClosePushLメソッドを使用してスタックに集合する必要がある.
  • オブジェクトをコレクションクラスに追加する場合は、オブジェクトのライフサイクルはコレクションによって管理され、コレクションが破棄されると
  • オブジェクトが破棄される「コレクション所有オブジェクト」のガイドラインに従う必要があります.
  • AppendLメソッドを呼び出す前に、AppendLが異常に終了しないように、追加するオブジェクトをクリーンアップスタックに追加します:
    CTest* test = CTest::NewL(); CleanupStack::PushL(test); array.AppendL(test); CleanupStack::Pop(test);
  • .
  • RArrayとRPointerArrayは、ストレージ要素に割り当てられたすべてのメモリを解放するためのResetメソッドを実装しています.RPointerArrayは、ポインタが指すオブジェクトとポインタ自体を解放するためのResetAndDestroyメソッドを実現します.2つ目のポイント「集合所有オブジェクト」では、RPointerArray::ResetAndDestroyメソッド
  • を使用します.
      変換元:   http://www.cnblogs.com/felixYeou/archive/2008/11/20/1337780.html