2011-03-19 9 views
0

私はウィンドウを作成するために使用するクラスを定義しました。フィールドの1つがhWndで、メンバー関数create()が呼び出されると、作成されたウィンドウへのHWNDがそこに格納されます。私は私が作成した最初の、メインウィンドウに子ウィンドウを作成しようと、私はによって返される奇数値にそれを追跡する際HWNDの型キャスト演算子のオーバーロードは、期待されるメンバー値の代わりにゴミを返します

operator HWND() { return(hWnd); } 

私のプログラムがクラッシュし始めた:私は(HWND)がその値を返すようにキャストし、オーバーロード型変換。私は典型的なgetter関数getHwnd()を定義しましたが、それは正常に動作しますが、型キャストは単にゴミを返します。私が紛失しているものがありますか?

クラス定義:呼び出しの

class WindowBuilder 
{ 
public: 
    WindowBuilder(FullWindow &fullWindow); 
    operator HWND()        { return(hWnd); } 
    void SetCaption(char const * caption)   { windowName = caption; } 
    void SetMenu(int resourceId); 
    void SetRender(RECT rect, HWND parent); 
    void SetButton(HWND parent); 
    void Create(); 
    void Show(int nCmdShow = SW_SHOWNORMAL); 
    HWND getHwnd()        { return(hWnd); } 

protected: 
    FullWindow &  window; 
    HWND   hWnd; 
    char const *  windowName; 
    DWORD   style; 
    int   x; 
    int   y; 
    int   width; 
    int   height; 
    HWND   hWndParent; 
    HMENU   hMenu; 
    void *   data; 
}; 

例:

FullWindow renderWindowClass("STATIC", GlobalInstance, WndProc); 
renderWindow = new WindowBuilder(renderWindowClass); 
renderWindow->SetRender(rect,mainWindow->getHwnd()); // used to be (HWND)mainWindow 
renderWindow->Create(); 
renderWindow->Show(CmdShow); 

/*RenderWindow = ::CreateWindow("STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 
    DEFAULT_BUTTON_WIDTH, 0, rect.right-rect.left-DEFAULT_BUTTON_WIDTH, 
    rect.bottom - rect.top, Window, NULL, hInstance, NULL);*/ 
+1

もっとコードを見ることなくわかりません。 –

+0

は、クラス宣言とそれをどのように使用していたかの1つの例を追加しました。もっと必要なものがあれば尋ねてください。 – Matt

答えて

1

あなたはmainWindowの定義は表示されませんが、あなたの使用に基づいて - >、私はあることそれを引き受けますWindowBuilderへのポインタです。したがって、(HWND)mainWindowを実行すると、キャスト演算子を呼び出すのではなく、ポインタ値をHWNDにキャストしています。キャスト演算子を呼び出すには、(HWND)(*mainWindow)のようなものを実行する必要があります。

このように、キャストオーバーロードをこのように使用しないと、より洗練されたデザインが得られると言わざるを得ません。コード内に現れにくい自動キャストが原因で微妙なバグが発生する可能性があります。明示的なgetHwnd()メンバーの使用ははるかに明確で信頼性が高いです。

+0

ありがとう!それがまさに問題でした。他のアドバイスもありがとうございます。このプログラムは、本当に深刻なプロジェクトではなく、私が以前にやっていなかったことを探究していた私にとっての学習プロジェクトです。 – Matt

関連する問題