我需要将类函数作为glutIdleFunc的参数传递。这种结构不起作用:
void (*func)(void) = this->step();
glutIdleFunc(func);
这也是:
void (*func)(void) = Core::step();
glutIdleFunc(func);
我该怎么办? 抱歉我的愚蠢...... :)
答案 0 :(得分:5)
在C ++中,glutIdleFunc()接受的回调必须是静态方法。尝试:
class Core
{
public:
static void step()
{
// ...
}
};
glutIdleFunc(Core::step);
答案 1 :(得分:1)
glutIdleFunc
根本不支持调用非静态成员函数。如果你想让空循环调用一个对象的方法,你需要在全局变量中放置一个指向该对象的指针,并有一个常规函数或静态成员在该全局对象上调用你的step
方法
有两种方法可以完成这项工作。更简单的方法:
// global scope
Core *foo = NULL;
void myIdleCallback()
{
foo->step();
}
// when initializing, in main or whatever
{
// ...
foo = &theThingIWantToCall;
glutIdleFunc(&myIdleCallback);
// ...
}
或者,稍微更大的封装:
// work these into your Core declaration
class Core {
static class Core* foo;
static void myIdleCallback() {
foo->step();
}
};
// at global scope
Core *Core::foo = NULL;
// at initialization time
{
// ...
Core::foo = &theThingIWantToCall;
// or if foo is private, add a static method to set it and call that
glutIdleFunc(&Core::myIdleCallback);
// ...
}
答案 2 :(得分:0)
类的成员函数有一个名为this的隐藏参数,它是指向其调用对象的指针。因此,当您尝试使用回调时,函数签名将不匹配,您应该使用没有隐藏此参数的静态函数。
答案 3 :(得分:0)
我认为问题在于这一行: void(* func)(void)= Core :: step();
看到你将函数的签名描述为void(* func)(void),这是C函数的签名,而不是c ++方法。 c ++中的所有非静态成员方法都与c函数类似,但另外还有一个隐藏参数,它是指向'this'的指针。
尝试将签名更改为void(Core :: * func)(void)= Core :: step();
您可以使用以下对象的实例进行调用: 核心考试; (试验* test.func)();
“f.test”返回指向方法的指针,“。*”运算符调用类的指针到成员函数