2009-07-27 117 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关联,那么您根本不需要该地图,并且效率更高,因为您需要做的只是指定指针而不是昂贵的地图查找。