2011-08-26 33 views
4

我剛開始使用OpenGL,使用GLUT。您無法將成員函數傳遞給GLUT函數。 (或者就此而言,指向成員的指針,儘管我沒有真正探索過這個選項)。GLUT和C++類

我想知道是否有一個「體面」的方式,或者什麼是「最正派」的方式來解決這個問題?我知道你可以使用靜態成員函數,但沒有更好的方法嗎?我知道還有其他庫,如用C++編寫的SFML,並提供基於類的C++接口,但我想知道GLUT(準確地說,freeglut)有什麼可能性。

回答

7

首先,GLUT不適用於嚴肅的應用工作。它適用於簡單的圖形演示。爲此目的,這很好。如果你發現自己想要在GLUT中進行認真的工作,你會發現自己花費大量時間來解決它的侷限性。這個限制只是你最終會遇到的許多問題之一。雖然GLFW仍然有這個限制(儘管下一個版本不會),但對於嚴肅的應用程序工作來說,它通常要優越。

其次,解決這個問題的「最正派」的方式取決於你在做什麼。如果你只有一個窗口,那麼正確的解決方案只是一個簡單的靜態函數,它可以將全局指針(或返回全局指針的函數)指向你感興趣的任何類。

如果你有多個窗口,那麼你需要的是一個從GLUT的窗口標識符映射到指向某個對象的指針的全局變量std::map。然後你可以從哪個窗口調用一個特定的函數,並使用該地圖將該調用轉發給代表該窗口的特定對象。

+0

感謝您的回答,目前這只是「簡單的演示」,但我會看看GLFW。關於GLUT的解決方案,好吧,我或多或少都在朝這個方向思考。 – KWyckmans

0

將成員函數傳遞給glut或任何其他庫很容易。 GLUT正在尋找一個函數指針。

讓Controller成爲一個帶有成員函數OnKeyPress的類,我們想發送到glutKeyboardFunc。您可能首先會去嘗試,像

glutKeyboardFunc(&Controller::OnKeyPress); 

在這裏,我們傳遞一個函數指針,但是這是不正確的,因爲你要發送該類對象的成員函數。在C++ 11中,您可以使用新的std::bind,或者如果您使用的是較舊的編譯器,我會推薦boost::bind。無論哪種方式,語法都差不多。

using namespace std::placeholders; // for the _1, _2 placeholders 
glutKeyboardFunc(std::bind(&Controller::OnKeyPress, &GLInput, _1, _2, _3)); 

從文檔看來,它看起來像glutKeyboardFunc需要3個參數。首先我們修復你的對象的第一個參數的內存地址,因爲它是一個成員函數,然後提供3個佔位符。

對於那些新來std :: bind的人來說,這感覺很奇怪,但是對於那些在C語言中完成了面向對象代碼的人來說,這很明顯。該函數實際上只是一個C函數,需要「this」指向該類的指針。如果回調是一個簡單的函數,綁定就沒有必要了。