如何正确使用类中的结构?

时间:2009-04-20 16:16:13

标签: c++ winapi class struct

使用: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,
};


};

我在这里缺少什么?

感谢。

2 个答案:

答案 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的一些有用的评论!]