我正在使用带有Visual Studio 2012的C ++(11)。
我使用自定义包装类创建窗口。
CUIWindow* winA = new CUIWindow ( NULL, TEXT("winAClassName"), TEXT("winACaption"), 200, 300 );
每个窗口都有一系列用于pluggabe事件的“套接字”。
public:
LPFNCUIWINDOWONCLOSE OnClose;
LPFNCUIWINDOWONDESTROY OnDestroy;
LPFNCUIWINDOWONNOTIFY OnNotify;
LPFNCUIWINDOWONSIZE OnSize;
LPFNCUIWINDOWONHOTKEY OnHotkey;
我使用以下宏来调用可以在消息循环中分配给我的窗口类的不同套接字:
#define MapEvent(e, fn) \
{ \
case e: \
if ( fn != nullptr ) \
return static_cast<LPARAM>( HANDLE_##e((hWnd), (wParam), (lParam), fn) ); \
}
我的情况如下;
您可以假设pWindow是指向CUIWindow对象的有效指针。
在显示的断点处,一些未初始化的OnXXXX事件被定义为0xCDCDCDCD,并在消息到达时被调用(无论我在创建类之后从未真正明确地设置它们)。这给了我一个0x0BADFOOD异常,因为函数指针是坏的。我会假设if ( fn != nullptr )
已经捕获了空函数指针但是现在我不太确定并且我正在请求帮助;
答案 0 :(得分:2)
在CUIWindow
类的构造函数中,您需要将这些成员明确设置为nullptr
(或NULL
或0
);因为所有这些指针都是原始指针,所以它们不会在0
构造函数中自动设置为CUIWindow
:
CUIWindow ( /* whatever parameters... */)
: OnClose(nullptr)
, OnDestroy(nullptr)
, OnNotify(nullptr)
, OnSize(nullptr)
, OnHotkey(nullptr)
{
// the constructor logic...
}
答案 1 :(得分:1)
未初始化的指针通常不会自动设置为空指针。稍微改变你的班级是一种选择吗?如果是这样,您可以设置所有这些,而无需命名所有这些。
struct CUIWindowEvents
{
LPFNCUIWINDOWONCLOSE OnClose;
LPFNCUIWINDOWONDESTROY OnDestroy;
LPFNCUIWINDOWONNOTIFY OnNotify;
LPFNCUIWINDOWONSIZE OnSize;
LPFNCUIWINDOWONHOTKEY OnHotkey;
}
class CUIWindow
{
public:
CUIWindowEvents Events; // move all events to a simple struct
CUIWindow() // and in your constructor
: Events() // initialise Events; this sets all the pointers to null
{ ... }
};