我已经创建了一个仅消息窗口类,我正在尝试将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;
但是当我尝试添加到地图时,程序崩溃了。我尝试了三种不同的形式,它们都给出了同样的错误:
...
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 :(得分:6)
您是从另一个静态初始化对象的构造函数中使用它吗?
阅读C ++ FAQ Lite - 10.12 What's the "static initialization order fiasco"?
答案 1 :(得分:1)
您根本不需要初始化它,默认情况下应该初始化它。
答案 2 :(得分:1)
出于好奇。窗口句柄不是null吗?因为如果窗口句柄返回为null,则插入将失败。
答案 3 :(得分:1)
原始问题可能已经解决,但我碰巧遇到了类似的问题(没有静态部分)。我曾经在一个函数里面有地图,然后将它移动到一个类变量。插入地图时我也遇到了崩溃。事实证明,我需要删除所有编译的对象并从头开始重新编译。然后一切都按预期工作。
答案 4 :(得分:0)
我的C ++有点生疏,但我认为你的.cpp文件中没有任何理由。事实上,由于它不是静态成员,我不确定会导致什么样的行为。但就像我说的那样,我生锈了 - 我可能会遗漏一些东西。
答案 5 :(得分:0)
这可能在此期间已经解决,但仅供参考:这是问题背后的实际问题的另一种解决方案:您可以将自定义数据存储在任何Window的GWL_USERDATA字段中(我相信使用:: SetWindowLong API功能,如果我没记错的话)。如果你把CMyClass指针放在那里而不是通过地图将它与HWND相关联,那么你根本就不需要地图,而且它更有效率,因为所有你需要做的就是对指针进行类型转换而不是昂贵地图查找。