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

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)

我在这里错过了什么?

谢谢.

Căt*_*tiș 5

您无法在类声明中初始化数组成员.您应该只声​​明MainMessages,然后在类的构造函数中初始化它.

我还建议使用std :: vector而不是数组.这样,decodeUINT声明变为:

std::vector<decodeUINT> MainMessages;
Run Code Online (Sandbox Code Playgroud)

在构造函数中,使用std :: vector :: push_back方法插入内容.

如果需要访问向量管理的内存,请使用&MainMessages [0].

  • +1.如果需要按对象消息调度,这是一种明智的方法,尽管数组上的const表明OP打算始终调用相同的函数.在这种情况下,使用静态数组成员更有效和方便(请参阅我的回答). (2认同)

j_r*_*ker 5

您不能以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的一些有用的评论!]