使用: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,
};
};
我在这里缺少什么?
感谢。
答案 0 :(得分:5)
您无法在类声明中初始化数组成员。您应该只声明MainMessages,然后在类的构造函数中初始化它。
我还建议使用std :: vector而不是数组。这样,decodeUINT声明变为:
std::vector<decodeUINT> MainMessages;
并在构造函数中,使用std :: vector :: push_back方法插入内容。
如果您需要访问向量管理的内存,请使用&amp; MainMessages [0]。
答案 1 :(得分:5)
您不能以这种方式为非static
成员指定初始化者 - 您通常需要声明该数组,然后在构造函数中填充它...除此之外,实际上无法初始化{ {1}} C ++中的成员数组(参见this thread)。
如果您准备在const
的所有实例中共享MainMessages
(我怀疑这是您一直以来的意图),您应该CScrollingListDlg
,在这种情况下您可以申报:
static
在static const decodeUINT MainMessages[]; // "struct" keyword unnecessary
的类定义中,然后在类外定义它:
CScrollingListDlg
为了实际编译,你需要制作const CScrollingListDlg::decodeUINT CScrollingListDlg::MainMessages[] = {
WM_PAINT, DoPaintMain,
WM_DESTROY, DoDestroyMain,
WM_QUIT, DoDestroyMain,
WM_COMMAND, DoCommandMain, // The comma *is* allowed -- thanks Josh!
};
,DoPaintMain()
等等DoDestroyMain()
- 就目前而言,它们都是每个对象隐式采用static
指针的方法,因此它们实际上不能包含在this
类型的函数指针中。 (您可以将它们保留为非静态方法,并将LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM)
中的指针类型更改为指向成员函数的指针类型,但这可能不是您想要的。)
[编辑:感谢Josh的一些有用的评论!]