Hvordan du skal bruke structs inne i en klasse?

stemmer
3

Ved hjelp: VS2008, Win32, C / C ++

Jeg prøver å kapsle hele mitt dialogvindu inn i en klasse for gjenbruk. Liksom som en egendefinert kontroll. Ved å gjøre dette, er jeg flytte mine egne arrangement i en klasse. Følgende struct design skjønt gir meg problemer med Visual Studio gi ut: error C2334 '{'.

Det er et enkelt budskap kartet layout. Men jeg kan ikke synes å unnslippe denne C2334 feil. :(

Her er min klasse kodebiten.

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,
};


};

Hva er det jeg mangler her?

Takk.

Publisert på 20/04/2009 klokken 16:16
kilden bruker
På andre språk...                            


2 svar

stemmer
5

Du kan ikke angi initialisers for ikke- staticmedlemmer på den måten - du normalt ville trenge å erklære array og deretter fylle den inne i konstruktøren ... Bortsett fra det, faktisk er det ingen måte å initialisere constmedlems arrays i C ++ (se denne tråden ) .

Hvis du er forberedt på å dele MainMessagesblant alle forekomster av CScrollingListDlg(som jeg mistenker var intensjonen hele tiden), bør du gjøre det static, i så fall kan erklære:

static const decodeUINT MainMessages[];  // "struct" keyword unnecessary

inne i klasse definisjonen av CScrollingListDlg, og deretter definere det utenfor klassen:

const CScrollingListDlg::decodeUINT CScrollingListDlg::MainMessages[] = {
    WM_PAINT,   DoPaintMain,
    WM_DESTROY, DoDestroyMain,
    WM_QUIT,    DoDestroyMain,
    WM_COMMAND, DoCommandMain,    // The comma *is* allowed -- thanks Josh!
};

For at dette skal faktisk kompilere, må du gjøre DoPaintMain(), DoDestroyMain()osv staticogså - som det står, de er alle per objekt metoder som implisitt tar en thispeker, slik at de kan faktisk ikke finnes i en funksjon peker av type LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM). (Du kan la dem som ikke-statiske metoder og endre pekeren type i decodeUINTen peker til medlem-funksjon type, men det er sannsynligvis ikke det du ønsker.)

[EDIT: Takk til Josh for noen nyttige kommentarer]

Svarte 20/04/2009 kl. 16:38
kilden bruker

stemmer
5

Du kan ikke initialisere en rekke medlem i en klasse erklæring. Du bør bare erklære MainMessages, så initialisere den i konstruktører av klassen.

Jeg anbefaler også å bruke std :: vector stedet for array. På denne måten blir decodeUINT erklæring:

std::vector<decodeUINT> MainMessages;

og i konstruktør, bruke std :: vektor :: push_back metode for å sette inn innhold.

Hvis du trenger tilgang til minne administrert av vektoren, bruke og MainMessages [0].

Svarte 20/04/2009 kl. 16:22
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more