【问题标题】:Pass a non-static method pointer as an argument to another method将非静态方法指针作为参数传递给另一个方法
【发布时间】:2013-05-03 09:59:47
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ methods static function-pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2015-02-12
      • 2013-07-01
      • 1970-01-01
      相关资源
      最近更新 更多