我正在使用計時器功能進行動畫製作,但我在將它放入Renderer類時遇到了問題。glutTimerFunc問題
void Renderer::animate(int value)
{
glutTimerFunc(TIMERMSECS, animate, 0);
}
錯誤: \ renderer.cpp(242):錯誤C3867: '渲染動畫::':函數調用缺少參數列表;使用「&渲染::有生」來創建一個指針構件
我正在使用計時器功能進行動畫製作,但我在將它放入Renderer類時遇到了問題。glutTimerFunc問題
void Renderer::animate(int value)
{
glutTimerFunc(TIMERMSECS, animate, 0);
}
錯誤: \ renderer.cpp(242):錯誤C3867: '渲染動畫::':函數調用缺少參數列表;使用「&渲染::有生」來創建一個指針構件
glutTimerFunc()
需要一個指向型void (*func)(int value)
,不void (Renderer::*func)(int value)
類型的成員函數的函數。
使Render::animate
爲靜態或使用全局函數。
問題是Renderer::animate
是一個類成員函數,因此有一個隱藏的this
參數。 glutTimerFunc
不知道要傳遞什麼值this
,所以如果您以某種方式嘗試用惡意轉換偷偷摸摸地通過編譯器,它會在運行時崩潰。
解決方法是將Renderer::animate
更改爲靜態方法或普通的全局函數。然後,您需要將指針存儲到您的Renderer
例如在一個全局變量,如:
class Renderer
{
static void staticAnimate(int value);
void animate(int value);
...
};
Renderer *gRenderer = ...;
void Renderer::staticAnimate(int value)
{
gRenderer->animate(value);
}
...
glutTimerFunc(TIMERMSECS, &Renderer::staticAnimate, 0);
如果sizeof(void*) <= sizeof(int)
(32位系統,真實的,但在64位系統上不正確的),那麼你也可以通過通過value
參數實例;但是,由於這不是可移植的,因此您不需要同時在多個不同的實例上調用glutTimerFunc
,您不必擔心爲此使用全局變量。
爲gRenderer即時得到這個 - > 錯誤C2227:左「 - >動畫」必須指向類/結構/聯合/通用型 錯誤C2227:左「 - >動畫」必須指向類/結構/聯合/泛型類型 – Aero 2010-10-15 07:10:11