0

Visual Studio2012で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例外が発生します。null関数ポインタがキャッチされたif ( fn != nullptr )と思っていたのですが、今はよくわかりません。助けを求めています。

  1. これが発生している理由を説明する
  2. ソケットが非常に多い場合があるため、コンストラクターですべての関数ポインターを明示的にゼロに設定せずに、これが発生しないようにするための最良の方法を見つけてください。
4

2 に答える 2

2

クラスのコンストラクターでは、これらのメンバーを(またはまたは)CUIWindowに明示的に設定する必要があります。これらのポインターはすべて生のポインターであるため、コンストラクターで自動的に設定されることはありません。nullptrNULL00CUIWindow

CUIWindow ( /* whatever parameters... */)
    : OnClose(nullptr)
    , OnDestroy(nullptr)
    , OnNotify(nullptr)
    , OnSize(nullptr)
    , OnHotkey(nullptr)
{
    // the constructor logic...
}
于 2012-12-12T07:20:26.127 に答える
1

通常、初期化されていないポインターが自動的に null ポインターに設定されることはありません。クラスを少し変更することはオプションですか?その場合は、すべてに名前を付けなくてもすべて設定できます。

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 に答える