2009-07-27 158 views
3

我已經創建了一個消息窗口類,並且我試圖將HWND映射回帶有這些句柄的對象。我想這樣做,使用專用靜態std::map<HWND, CMyClass*>屬於類,像這樣:如何初始化靜態std :: map?

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; 

但是當我嘗試要添加到地圖,程序崩潰。我已經嘗試三種不同的形式,他們都給予了同樣的錯誤:

... 
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); _Parent(_Myhead)返回(_Nodepref)(*_Myhead)._Parent,由於_Myhead爲空而失敗。

如何初始化地圖,使其頭部非空,並且可以插入東西而不會崩潰?道歉,如果我已經解釋了這一點 - 我是C++的新手。

+0

你可以發佈你調用插入的代碼嗎?也是之前的路線? – 2009-07-27 13:35:16

+3

從您的代碼中,地圖未聲明爲靜態。 – 2009-07-27 13:36:57

+0

@尼爾:好點。它是在原來的 - 修復。 – Simon 2009-07-27 13:41:03

回答

0

我的C++有點生疏,但我不認爲有任何理由讓你的.cpp文件中有該行。事實上,由於它不是一個靜態成員,我不確定會導致什麼樣的行爲。但就像我說的,我很生疏 - 我可能會錯過一些東西。

1

你根本不需要初始化它,它應該默認初始化。

1

只是出於好奇。窗口句柄是否爲空?因爲如果窗口句柄返回爲空,則插入將失敗。

1

原始問題可能已經解決了,但是我碰巧碰到類似的問題(沒有靜態部分)。我曾經有過一個函數內的地圖,然後將它移到一個類變量。插入地圖時,我也遇到了崩潰。事實證明,我需要刪除所有編譯的對象,並重新從頭開始編譯。然後一切按預期工作。

0

這可能是同時解決的,但僅供參考:這裏是另一個問題背後的實際問題的解決方案:您可以將自定義數據存儲在任何窗口的GWL_USERDATA字段中(我相信使用:: SetWindowLong API函數,如果我沒記錯的話)。如果您將CMyClass指針放在那裏,而不是通過地圖將其與HWND關聯,那麼您根本不需要該地圖,並且效率更高,因爲您需要做的只是指定指針而不是昂貴的地圖查找。