3

メッセージのみのウィンドウ クラスを作成し、これらのハンドルを持つオブジェクトに HWND をマップしようとしています。std::map<HWND, CMyClass*>次のように、クラスに属するプライベート静的を使用してそれを実行しようとしています:

MyClass.h:

class CMyClass
{
    ...

private:
    HWND        m_hWnd;
    HINSTANCE   m_hInstance;
    LPCSTR      m_szClassName;

    static std::map<HWND, CMyClass*> s_mapHandles;

    ...
};

MyClass.cpp:

std::map<HWND, CMyClass*> CMyClass::s_mapHandles;

しかし、マップに追加しようとすると、プログラムがクラッシュします。3 つの異なるフォームを試しましたが、すべて同じエラーが発生します。

...
m_hWnd = ::CreateWindowEx(0, m_szClassName, "Message Window", 0, 0, 0, 0, 0, HWND_MESSAGE, 0, m_hInstance, 0);
s_mapHandles.insert(pair<HWND, CMyClass*>(m_hWnd, this));

また

...
s_mapHandles.insert(s_mapHandles.end(), pair<HWND, CMyClass*>(m_hWnd, this));

あるいは

...
s_mapHandles[m_hWnd] = this;

いずれの場合も、_Root()を戻そうとする呼び出しでクラッシュが発生し_Parent(_Myhead)ます。がnullであるために失敗したものを_Parent(_Myhead)返します。(_Nodepref)(*_Myhead)._Parent_Myhead

マップのヘッドが null ではなく、クラッシュすることなく挿入できるように、マップを初期化するにはどうすればよいですか? これをひどく説明した場合はお詫び申し上げます-私はC ++を初めて使用します。

4

6 に答える 6

6

別の静的に初期化されたオブジェクトのコンストラクターから使用していますか?

C++ FAQ Lite - 10.12 を読む「静的初期化順序の大失敗」とは?

于 2009-07-27T13:49:47.793 に答える
1

単なる好奇心から。ウィンドウハンドルはnullではありませんか?ウィンドウハンドルがnullとして戻った場合、挿入は失敗するためです。

于 2009-07-27T14:18:07.940 に答える
1

元の問題はすでに解決されている可能性がありますが、たまたま同様の問題に遭遇しました(静的部分なし)。以前は関数内にマップを持っていましたが、それをクラス変数に移動しました。マップに挿入するときにもクラッシュしました。コンパイルされたすべてのオブジェクトを削除し、最初からコンパイルをやり直す必要があることがわかりました。その後、すべてが期待どおりに機能します。

于 2010-06-24T13:11:36.773 に答える
1

初期化する必要はまったくありません。デフォルトで初期化する必要があります。

于 2009-07-27T13:40:13.200 に答える
0

私の C++ は少しさびていますが、.cpp ファイルにその行を含める理由はないと思います。実際、静的メンバーではないため、どのような動作になるかはわかりません。しかし、私が言ったように、私は錆びています - 私は何かが欠けている可能性があります.

于 2009-07-27T13:35:57.513 に答える
0

これはおそらく当面は解決されていますが、参考までに: 質問の背後にある実際の問題の別の解決策を次に示します: 任意のウィンドウの GWL_USERDATA フィールドにカスタム データを格納できます (私が正しく覚えてください)。マップを介して HWND に関連付ける代わりに CMyClass ポインターをそこに配置すると、マップはまったく必要ありません。高価なポインターの代わりにポインターを型キャストするだけでよいため、より効率的です。マップ検索。

于 2011-08-01T19:45:19.723 に答える