なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

wxListの使いかた

// Listの中にぶち込みたいデータ型を定義する
// データ型を書いたヘッダファイル(.h)を別に作成して定義したほうが良い
class HogeData {
public :
   wxString name;
   int number;
};

/** 宣言 */
// HogeDataを格納できるHogeDataListを宣言する
// この宣言はListを使うクラスのヘッダファイルなどですると良いと思う
class HogeData;
WX_DECLARE_LIST(HogeData, HogeDataList);
・
・
・
/** 実装 */
// Listを実装するソースファイル(.cpp)にこれを書く
// これで実装部分でリストを使うことが許されるんやな
#include <wx/listimpl.cpp>
WX_DEFINE_LIST(HogeDataList);

void HogeFrame::SetHogeList()
{
   // リストを生成
   HogeDataList* kochikame = new HogeDataList();

   /** なんかいろいろ処理 */
   delete kochikame;
}

と、まあこんな感じで実装するのだが、このままだとエラー出ます。具体的には wxWidgets-**/src/common/list.cppの警告が出る、主にこの辺から

wxNodeBase *wxListBase::Append (const wxString& key, void *object)
{
    wxCHECK_MSG( (m_keyType == wxKEY_STRING) ||
                 (m_keyType == wxKEY_NONE && m_count == 0),
                 NULL,
                 wxT("can't append object with string key to this list") );

    wxNodeBase *node = CreateNode(m_nodeLast, NULL, object, key);
    return AppendCommon(node);
}

wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object)
{
    // all objects in a keyed list should have a key
    wxCHECK_MSG( m_keyType == wxKEY_NONE, NULL,
                 wxT("need a key for the object to insert") );

    wxCHECK_MSG( !position || position->m_list == this, NULL,
                 wxT("can't insert before a node from another list") );

なんでかって言うとwxListを単純に宣言するとなぜかkey付きのListが生成されるから。これはwxWidgets開発者の老婆心なのかおせっかいなのか。というかkey付きリストとかいらねえ。
だから以下のように宣言を変える。キー無しでリストを作る。

void HogeFrame::SetHogeList()
{
   // リストを生成
   HogeDataList* kochikame = new HogeDataList(wxKEY_NONE);

   /** なんかいろいろ処理 */
   delete kochikame;
}

参考:wxWidgets Discussion Forum • View topic - How to define a keyed wxList?