Как правильно использовать структуры внутри класса? - PullRequest
3 голосов
/ 20 апреля 2009

Использование: 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 ]

5 голосов
/ 20 апреля 2009

Вы не можете указывать инициализаторы для не static членов таким образом - обычно вам нужно объявить массив и затем заполнить его внутри конструктора ... За исключением того, что фактически нет способа инициализировать const массивы-члены в C ++ (см. в этой теме ).

Если вы готовы поделиться 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 - в сущности, все они являются методами для каждого объекта, которые неявно принимают Указатель 1020 *, поэтому они не могут содержаться в указателе функции типа LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM). (Вы можете оставить их как нестатические методы и изменить тип указателя в decodeUINT на тип указателя на функцию-член, но это, вероятно, не то, что вам нужно.)

[РЕДАКТИРОВАТЬ: Спасибо Джошу за некоторые полезные комментарии!]

5 голосов
/ 20 апреля 2009

Вы не можете инициализировать член массива внутри объявления класса. Вы должны только объявить MainMessages, а затем инициализировать его в конструкторах класса.

Я также рекомендую использовать std :: vector вместо массива. Таким образом, объявление decodeUINT становится:

std::vector<decodeUINT> MainMessages;

и в конструкторе используйте метод std :: vector :: push_back для вставки содержимого.

Если вам нужен доступ к памяти, управляемой вектором, используйте & MainMessages [0].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...