Seb*_*nik 3 c++ winapi struct class
使用:VS2008,Win32,C/C++
我正在尝试将整个对话框窗口封装到一个可重用性的类中.有点像自定义控件.在这样做的过程中,我将我的单独功能转移到了一个类中.以下结构设计给我带来了问题,Visual Studio输出:错误C2334'{'.
这是一个简单的消息映射布局.但我似乎无法逃避这个C2334错误.:(
这是我的类代码片段.
class CScrollingListDlg
{
private:
LRESULT DoCommandMain (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT DoPaintMain (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT DoAnimationTimer (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT DoHandleTouch (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
LRESULT DoDestroyMain (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
//
// message maps
//
// Generic defines and data types.
struct decodeUINT {
UINT Code;
LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM);
};
struct decodeCMD {
UINT Code;
LRESULT (*Fxn)(HWND, WORD, HWND, WORD);
};
// WM_Message dispatch table for MainWndProc.
//
// *** error C2334 '{' ***
//
const struct decodeUINT MainMessages[] = {
WM_PAINT, DoPaintMain,
WM_DESTROY, DoDestroyMain,
WM_QUIT, DoDestroyMain,
WM_COMMAND, DoCommandMain,
};
};
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
谢谢.
您无法在类声明中初始化数组成员.您应该只声明MainMessages,然后在类的构造函数中初始化它.
我还建议使用std :: vector而不是数组.这样,decodeUINT声明变为:
std::vector<decodeUINT> MainMessages;
Run Code Online (Sandbox Code Playgroud)
在构造函数中,使用std :: vector :: push_back方法插入内容.
如果需要访问向量管理的内存,请使用&MainMessages [0].
您不能以static这种方式为非成员指定初始化者- 您通常需要声明该数组然后在构造函数中填充它...除此之外,实际上无法const在C++中初始化成员数组(请参阅此主题) .
如果您准备MainMessages在所有CScrollingListDlg(我怀疑一直是您的意图)的实例中分享,您应该成功static,在这种情况下您可以声明:
static const decodeUINT MainMessages[]; // "struct" keyword unnecessary
Run Code Online (Sandbox Code Playgroud)
在类的定义里面CScrollingListDlg,然后在类之外定义它:
const CScrollingListDlg::decodeUINT CScrollingListDlg::MainMessages[] = {
WM_PAINT, DoPaintMain,
WM_DESTROY, DoDestroyMain,
WM_QUIT, DoDestroyMain,
WM_COMMAND, DoCommandMain, // The comma *is* allowed -- thanks Josh!
};
Run Code Online (Sandbox Code Playgroud)
为了实际编译,你需要make DoPaintMain(),DoDestroyMain()等等static- 就目前而言,它们都是隐藏式this指针的每个对象方法,所以它们实际上不能包含在函数中指针的类型LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM).(您可以将它们保留为非静态方法,并将指针类型更改为指向decodeUINT成员函数的指针类型,但这可能不是您想要的.)
[编辑:感谢Josh的一些有用的评论!]