为什么回调函数在类中声明时需要是静态的

时间:2010-03-08 10:43:11

标签: c++ callback

我试图在类中声明一个回调函数,然后在某处我读到函数需要是静态的但它没有解释为什么?

#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);
}

6 个答案:

答案 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来使用仿函数和成员方法。