我正在使用计时器函数进行动画处理,但是将其放在Renderer类中时遇到问题。

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

错误:
\ renderer.cpp(242):错误C3867:'Renderer::animate':函数调用缺少参数列表;使用'&Renderer::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位系统上为true,但在64位系统上为true),则还可以通过value参数传递实例;但是,由于这不是可移植的,并且您永远不需要同时在多个不同的实例上调用glutTimerFunc,因此您不必担心为此使用全局变量。

关于c++ - glutTimerFunc问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3939509/

10-12 22:25