我试图在类中声明一个回调函数,然后在某处我读到函数需要是静态的但它没有解释为什么?
#include <iostream>
using std::cout;
using std::endl;
class Test
{
public:
Test() {}
void my_func(void (*f)())
{
cout << "In My Function" << endl;
f(); //Invoke callback function
}
static void callback_func()
{cout << "In Callback function" << endl;}
};
int main()
{
Test Obj;
Obj.my_func(Obj.callback_func);
}
答案 0 :(得分:20)
成员函数是需要调用类实例的函数。 如果不提供要调用的实例,则无法调用成员函数。这使得有时使用起来更困难。
静态函数几乎就像一个全局函数:它不需要调用类实例。因此,您只需要获取指向函数的指针即可调用它。
看看std :: function(或std :: tr1 :: function或boost :: function,如果你的编译器还没有提供它),它在你的情况下是有用的,因为它允许你使用任何东西callable(provide()语法或运算符)作为回调,包括可调用对象和成员函数(对于这种情况,请参阅std :: bind或boost :: bind)。
答案 1 :(得分:8)
回调需要是静态的,以便它们没有隐式this
参数作为其函数签名中的第一个参数。
答案 2 :(得分:4)
非静态方法需要'this'实例,并且只能在对象实例上调用。
但是,可以使用非静态回调,但它们在语法上更难编写。有关说明,请参阅http://www.newty.de/fpt/callback.html#member。
答案 3 :(得分:3)
它必须是静态的,以便函数签名匹配。当调用成员函数时,隐藏参数包含在调用中(即“this”指针)。在静态成员函数中,this指针不作为参数传递。
答案 4 :(得分:3)
Marshal Cline为您提供完整的答案here 。整个部分包含您需要了解的所有内容。
总结一下,它可以解释您需要一个静态成员,因为不需要this
指针(与普通成员方法不同)。但它也涵盖了使用静态对于所有编译器来说可能还不够,因为C ++调用约定可能在C和C ++之间有所不同。
因此建议使用extern "C"
非成员函数。
答案 5 :(得分:0)
如果使用函数指针,则在调用函数时,运行时环境无法传递对实例的引用。但是你可以使用std :: mem_fun&lt;&gt;,in来使用仿函数和成员方法。