2

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

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 方法,以便在执行回调时调用处理程序。

我已经尝试了各种方法来完成这项工作,并且不想制作静态方法(出于我不会讨论的原因)。我想我已经很接近了,但最后有点摔倒了!任何帮助,将不胜感激。

4

2 回答 2

1

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

如果您无权访问foo该类的源代码,您可以创建一个静态函数,该函数调用存储在已知位置(即静态变量中)的对象的成员函数。如果这样做,请考虑更改 API 以获取函数对象,类似于标准 C++ 库中的函数。

最后,在 C 库中使用函数指针的常用方法 - 传递一个附加void*指针,该指针将在对函数指针的调用中传回;pthreads库就是这样做的。如果是这种情况,您可以创建struct包装调用目标对象的 a,并将指向 this 的指针struct传递回您的静态函数。

于 2013-05-09T01:56:46.313 回答
0

AFAIK我认为没有其他方法。您必须将方法设为静态。

于 2013-05-09T01:55:34.843 回答