2013-05-09 52 views
1

对不起,提出这样一个问题,因为我确信它之前已经得到了答案,但我正在努力寻找答案,而不是为了寻找答案。 ..反正..将一个非静态方法指针作为参数传递给另一个方法

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

因此,基本上,所有我想要做的就是通过所谓的处理程序作为一个函数指针读法,在非静态成员方法,以便执行回调的情况下,处理程序被调用。

我试过各种各样的方法来使这项工作,并不想让静态方法(因为我不会进入)。我觉得我非常接近,但最后还是有点失败!任何帮助,将不胜感激。

+1

查看常见问题简介,他们有一个伟大的专门讨论这个部分:http://www.parashift.com/c++-faq/pointers-to-members.html – Constantin 2013-05-09 01:51:33

回答

1

你不能这样做:与可以独立调用的静态函数不同,成员函数的调用需要知道两件事情 - 被调用的函数和调用它的对象。这就是为什么不可能将成员函数传递给需要“普通”函数指针的API。

如果您无权访问foo类的源,则可以创建一个静态函数,用于调用存储在众所周知位置(即静态变量)中的对象上的成员函数。如果是这样,请考虑将API更改为一个函数对象,类似于标准C++库中的函数。

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

0

AFAIK我认为没有其他办法。您将不得不使该方法变为静态。

相关问题