glutTimerFunc问题

时间:2010-10-15 04:33:07

标签: c++ glut

我正在使用计时器功能来制作动画,但是当我将它放在Renderer类中时,我遇到了问题。

void Renderer::animate(int value)
{
 glutTimerFunc(TIMERMSECS, animate, 0);
}

错误: \ renderer.cpp(242):错误C3867:'Renderer :: animate':函数调用缺少参数列表;使用'& Renderer :: animate'创建指向成员的指针

2 个答案:

答案 0 :(得分:2)

问题是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位系统上为true,但在64位系统上不为真),那么您也可以通过value参数传递实例;但是,由于这不是可移植的,并且您不需要同时在多个不同的实例上调用glutTimerFunc,因此您不必担心为此使用全局变量。

答案 1 :(得分:1)

glutTimerFunc()需要一个指向void (*func)(int value)类型函数的指针,而不是void (Renderer::*func)(int value)类型的成员函数。

使Render::animate静态或使用全局函数。