前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

10.2. 4 バイトより大きなオブジェクトの扱い

コレクションクラスには、4 バイトより大きなオブジェクトを直接格納することはできません。

[Note] 例外

例外として、SFXHashmap クラスに SFXAnsiStringSFXWideString を格納するのは可能です。

代わりにオブジェクトへのポインタを格納します。

定義

// SFXAnsiString を格納する可変長配列 (SFXArray) の定義
// SFXAnsiString を指すポインタを格納する
SFXArray<SFXAnsiStringPtr> array;

要素の追加

// SFXAnsiString を動的に生成
SFXAnsiStringPtr str = new SFXAnsiString("abc");

// ポインタを格納
array.Append(str);

// 直接記述できる
array.Append(new SFXAnsiString("def"));

要素の取得、設定

// 前から 2 番目の要素を取得
SFXAnsiStringPtr str = array[1];

// 表示
TRACE("%s", str->GetCString());

// 直接表示
TRACE("%s", array[1]->GetCString());

// 要素の設定

// 直接 array[0] = new SFXAnsiString("ghi"); とするとメモリリークを起こす

delete array[0]; // 動的に生成した配列は delete する必要がある

array[0] = new SFXAnsiString("ghi");

要素数の取得

SInt32 n = array.GetSize(); // n は 2 となる

一部削除

// array[3] から array[4] までを削除 (array[5] までではない)
SInt32 i;

for (i = 3; i < 5; ++i) {
    delete array[i];
}

array.Remove(3, 5);

全削除

SFXArray<SFXAnsiStringPtr>::Iterator iterator = array.GetIterator();

while (iterator.HasNext()) {
    SFXAnsiStringPtr str = iterator.GetNext();
    delete str;
}

array.Clear(); // array は空となる

検索・存在判定

// SInt32 n1 = array.IndexOf("abc"); 不可
// SInt32 n2 = array.IndexOf(new SFXAnsiString("abc")); 不可

// 以下のように書く必要がある

SFXArray<SFXAnsiStringPtr>::Iterator iterator = array.GetIterator();

while (iterator.HasNext()) {
    SFXAnsiStringPtr str = iterator.GetNext();
    if (str->Equals("abc")) {
        return true;
    }
}
return false;