C++ 将非静态方法指针作为参数传递给另一个方法

C++ 将非静态方法指针作为参数传递给另一个方法,c++,methods,static,function-pointers,C++,Methods,Static,Function Pointers,很抱歉问这样一个问题,因为我相信它以前已经被回答过了,但我正在努力寻找答案,这不是因为不想看。。。无论如何 class foo { void read(void (*func)(obj&)) { // many things happen to obj... (*func)(obj); // Calls the function pointer to the handler. } }; class bar : public

很抱歉问这样一个问题,因为我相信它以前已经被回答过了,但我正在努力寻找答案,这不是因为不想看。。。无论如何

class foo
{
    void read(void (*func)(obj&))
    {
        // many things happen to obj...
        (*func)(obj);    // Calls the function pointer to the handler.
    }

};
class bar : public foo
{
    void handler(obj&)
    {
        // 
    }
};

void main()
{
    foo f;

    typedef void (foo::*funcptr)(obj&);
    funcptr ptr = &foo::handler;

    f.read(ptr);   ????
}
因此,基本上,我所要做的就是将名为handler的非静态成员方法作为函数指针传递给read方法,以便在执行回调时调用该处理程序


我已经尝试了各种方法来实现这一点,但我不想使用静态方法(出于我不想深入讨论的原因)。我想我已经很接近了,但最后还是有点摔倒了!任何帮助都将不胜感激。

好的,我想没有其他办法了。您必须将该方法设置为静态。

您不能这样做:与可以自己调用的静态函数不同,成员函数的调用需要了解两方面的知识—被调用的函数和调用它的对象。这就是为什么不可能将成员函数传递给期望“普通”函数指针的API的原因

如果您无权访问
foo
类的源,则可以创建一个静态函数,该函数调用存储在已知位置(即静态变量中)的对象上的成员函数。如果你这样做,考虑改变API以获取一个函数对象,类似于标准C++库所做的功能。
最后,在C库中有一种使用函数指针的常用方法——传递一个额外的
void*
指针,该指针将在调用函数指针时传回;图书馆就是这样做的。如果是这种情况,您可以创建一个包装调用目标对象的
struct
,并将指向此
struct
的指针传递回静态函数。

查看FAQ lite,他们有一个专门讨论此问题的重要部分:您可能感兴趣:或者: