我定义了一个我想用来构建窗口的类。其中一个字段是hWnd,当调用成员函数create()时,创建窗口的HWND存储在那里。我重载了(HWND)强制转换以返回该值:
operator HWND() { return(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);*/
答案 0 :(得分:1)
您没有显示mainWindow
的定义,但根据您对 - >的使用,我会假设它是指向WindowBuilder的指针。因此,当您执行(HWND)mainWindow
时,您将指针值转换为HWND,而不是调用您的强制转换运算符。要调用您的强制转换操作符,您需要执行(HWND)(*mainWindow)
。
话虽如此,如果你不以这种方式使用演员超载,我觉得有必要说你会有更清洁的设计。它们可能会导致细微的错误,因为自动转换可能很难在代码中发现。使用明确的getHwnd()
成员会更加清晰可靠。