C++ 如何获得课程';来自另一个类的非静态函数的函数指针';s函数?
我需要传递类函数作为glutIdleFunc的参数。这种构造不起作用:C++ 如何获得课程';来自另一个类的非静态函数的函数指针';s函数?,c++,class,function-pointers,C++,Class,Function Pointers,我需要传递类函数作为glutIdleFunc的参数。这种构造不起作用: void (*func)(void) = this->step(); glutIdleFunc(func); 这也是: void (*func)(void) = Core::step(); glutIdleFunc(func); 我怎么做? 对不起我的愚蠢…:)
void (*func)(void) = this->step();
glutIdleFunc(func);
这也是:
void (*func)(void) = Core::step();
glutIdleFunc(func);
我怎么做?
对不起我的愚蠢…:)
class Core
{
public:
static void step()
{
// ...
}
};
glutIdleFunc(Core::step);
在C++中,回调函数(如所接受的回调)必须是静态方法。尝试:
class Core
{
public:
static void step()
{
// ...
}
};
glutIdleFunc(Core::step);
类的成员函数有一个名为this的隐藏参数,该参数是指向其调用对象的指针。因此,当您尝试将其用作回调时,函数签名将不匹配,您应该使用没有隐藏this参数的静态函数。类的成员函数有一个名为this的隐藏参数,该参数是指向其调用对象的指针。因此,当您尝试将其用作回调函数时,函数签名将不匹配,您应该使用没有隐藏此参数的静态函数。
glutIdleFunc
根本不支持调用非静态成员函数。如果希望空闲循环调用对象的方法,则需要在全局变量中放置一个指向该对象的指针,并使用一个常规函数或静态成员来调用该全局对象上的步骤
方法
有两种方法可以让你做到这一点。更简单的方法是:
// 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);
// ...
}
glutIdleFunc
不支持调用非静态成员函数。如果希望空闲循环调用对象的方法,则需要在全局变量中放置一个指向该对象的指针,并使用一个常规函数或静态成员来调用该全局对象上的步骤
方法
有两种方法可以让你做到这一点。更简单的方法是:
// 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);
// ...
}
我认为问题在于这一行: void(*func)(void)=核心::步骤() <>请将函数的签名描述为空隙(*FUNC)(空格),这是C函数的签名,而不是C++方法。 C++中所有非静态成员方法都类似于C函数,但另外还有一个隐藏参数,它是指向“这个”的指针。 尝试将签名更改为void(Core::*func)(void)=Core::step() 您可以使用以下命令从对象的实例调用: 岩心测试; (test.*test.func)()
“f.test”返回指向方法的指针,“*”运算符调用类上指向成员函数的指针我认为问题在于这一行: void(*func)(void)=核心::步骤() <>请将函数的签名描述为空隙(*FUNC)(空格),这是C函数的签名,而不是C++方法。 C++中所有非静态成员方法都类似于C函数,但另外还有一个隐藏参数,它是指向“这个”的指针。 尝试将签名更改为void(Core::*func)(void)=Core::step() 您可以使用以下命令从对象的实例调用: 岩心测试; (test.*test.func)() “f.test”返回指向该方法的指针,“*”运算符调用类上指向成员函数的指针FYI:您正在查找一个(通常称为lambdas),它是C++0x的一部分;请参阅以获取更多信息。仅供参考:您正在寻找一个(通常称为lambdas),它是C++0x的一部分;有关更多信息,请参阅。