2011-12-19 99 views
2

現在我正在寫一個帶有opengl的MFC程序。當我試圖OpenGL的與MFC結合起來,我遇到了一些問題: 首先,我定義的類名爲:CSCommTestDlg,並與規範中定義的成員函數如下:如何指向C++中全局函數中的成員函數?

void CSCommTestDlg::OpglMain(int argc, char* argv[]) 
{ 
    glutDisplayFunc(displayCude); 
} 

displayCube也是類CSCommTestDlg和glutDisplayFunc的成員函數是一個全球性的funcion(OpenGL的功能),glutDisplayFunc的函數聲明如下:

GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void)); 

是的,正如你所看到的,glutDisplayFunc的參數是一個函數指針,並且我將它指向了一個成員函數ñdisplayCube,這似乎是非法的,我有這樣的一個錯誤:

error C2664: 'glutDisplayFunc' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)' 
    None of the functions with this name in scope match the target type 

看來,我不能指向全局函數的成員函數,但我需要它。如何解決它?

+0

['mem_fn'](http://en.cppreference.com/w/cpp/utility/functional/mem_fn)? – 2011-12-19 09:03:55

+0

我個人會使用glut以外的庫,或者用一堆靜態函數(回調函數)來創建一個框架,該函數擁有某些類型的具有與這些回調函數調用相匹配的Game對象。所以存在一種貪婪和遊戲之間的界面。 (我想我假設你正在寫一個遊戲哈哈) – 2011-12-19 09:04:40

+0

@JoachimPileborg:這將如何幫助提問者? – 2011-12-19 11:29:29

回答

2

glutDisplayFunc需要一個全局函數,所以,簡單地說,你不能讓它成爲一個成員函數指針。

一種解決方案是將displayCube標記爲靜態,但這樣做有點破壞了首先有一個類的要點。

另一種選擇是將全局函數聲明爲glut顯示回調函數,然後在該函數內調用CSCommTestDlg對象的displayCube成員函數 - 如果可以獲取指向它的全局指針。

1

現在我正在寫一個帶有opengl的MFC程序。當我試圖將MFC與OpenGL結合起來。

如果您使用MFC或其他工具包,請勿使用GLUT! GLUT不是OpenGL的一部分,您不需要使用它。

和我做它指向一個成員函數displayCube,這似乎是非法的,我有這樣的一個錯誤:

自然。因爲一個成員函數需要調用一個類實例。如果您查看生成的機器代碼,它看起來就像是有一個指向作爲第一個參數傳遞的類實例的指針。所以你實際需要的是所謂的「封閉」,功能只是不支持C++。

可以用一些動態生成的代碼欺騙來模擬閉包。但在你的情況下,這不是必需的。GLUT和其他工具包不能混用。