2009-04-20 49 views
3

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


}; 

缺少什麼我在這裏?

感謝。

回答

5

您不能以這種方式指定非static成員的初始值 - 通常您需要聲明該數組,然後將其填充到構造函數中......除此之外,實際上無法將const成員數組初始化爲C++(見this thread)。

如果您願意分享MainMessagesCScrollingListDlg所有實例(我懷疑是你的意圖一直)之間,你應該讓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)的函數指針中。 (你可以把它們作爲非靜態方法,並將指針類型改爲decodeUINT,指向成員函數類型,但這可能不是你想要的。)

[編輯:感謝喬希的一些有用的意見!]

5

不能初始化類聲明中的數組成員。您應該只聲明MainMessages,然後在類的構造函數中初始化它。

我也推薦使用std :: vector而不是array。這樣,decodeUINT dec laration變成:

std::vector<decodeUINT> MainMessages; 

在構造函數中,使用std :: vector :: push_back方法插入內容。

如果您需要訪問由向量管理的內存,請使用& MainMessages [0]。

+2

+1。如果需要執行每個對象的消息分派,這是一個明智的方法,但數組上的常量表明OP希望始終調用相同的函數。在這種情況下,使用靜態數組成員更加高效和方便(請參閱我的答案)。 – 2009-04-20 16:43:09

+0

特別是因爲MainMessages被聲明爲const,所以我懷疑靜態數組是什麼需要的。 – Eclipse 2009-04-20 16:51:54