0

我正在使用带有 Visual Studio 2012 的 C++(11)。

我使用定制的包装类创建窗口。

CUIWindow* winA = new CUIWindow ( NULL, TEXT("winAClassName"), TEXT("winACaption"), 200, 300 );

每个窗口都有一系列用于插件事件的“套接字”。

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 )但是现在我不太确定,我正在请求帮助;

  1. 解释为什么会发生这种情况
  2. 找到阻止这种情况发生的最佳方法,最好不要在构造函数中将所有函数指针显式设置为零,因为有时会有很多很多套接字。
4

2 回答 2

2

CUIWindow类的构造函数中,您需要将这些成员显式设置为nullptr(或NULL0);由于所有这些指针都是原始指针,因此它们不会0CUIWindow构造函数中自动设置为:

CUIWindow ( /* whatever parameters... */)
    : OnClose(nullptr)
    , OnDestroy(nullptr)
    , OnNotify(nullptr)
    , OnSize(nullptr)
    , OnHotkey(nullptr)
{
    // the constructor logic...
}
于 2012-12-12T07:20:26.127 回答
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
    { ... }
};
于 2012-12-12T07:21:55.713 回答