首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成员函数的回调

成员函数的回调
EN

Stack Overflow用户
提问于 2014-11-20 17:01:08
回答 2查看 629关注 1票数 0

我有一个带有此签名的回调(我使用的是Live555):

代码语言:javascript
复制
typedef void(RTSPClient::responseHandler)(RTSPClient*, ...); //... = other parameters

然后,在我的代码中,我按照库规则创建了一个RTSPClient子类:

代码语言:javascript
复制
class MyRTSPClient: public RTSPClient { 
... 

//callback 

void continueAfterDESCRIBE(RTSPClient *client, ...); //same signature of typedef

...

};

现在问题来了。

在我的代码中,我必须调用以下方法:

代码语言:javascript
复制
unsigned RTSPClient::sendDescribeCommand(responseHandler, ...); //response handler is the typedef

如果我创建一个对象:

代码语言:javascript
复制
MyRTSPClient *client = MyRTSPClient::createNew(...); //is library requirement such creation

如何将函数对象作为回调传递给sendDescribeCommand

当然,如果我声明continueAfterDESCRIBE为静态成员,我没有任何问题,但是我想要一个对象,因为我有很多线程,如果我使用从它们调用的静态回调,就会引发许多同步问题。

因此,我(作为C++中的新手)很难找到正确的签名来传递obj->method作为回调。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-20 17:17:41

不能将非静态成员函数用作期望常规函数的回调参数,因为它们的签名不兼容:

  • 非成员或静态成员函数只接受其签名中的参数。
  • 非静态成员函数为调用对象接受额外的“隐藏”参数。

只有在执行回调的库允许您传递带有回调注册的自定义参数时,才有可能解决这一问题。这通常是通过一个void*指针完成的,当您注册回调时,这个指针会传递给库,然后当它调用回调函数时,库会将它传递回您。

以下是如何:

代码语言:javascript
复制
// This is the static function that you register for your callback
static void staticContinueAfterDESCRIBE(RTSPClient *client, ...) {
    static_cast<MyRTSPClient*>(client)-> continueAfterDESCRIBE(client, ...);
}

既然函数是静态的,那么将它注册为回调没有问题。一旦该函数获得该控件,它就会将client转换为您的MyRTSPClient*类,并执行非静态回调。

票数 0
EN

Stack Overflow用户

发布于 2014-11-20 17:19:25

您需要两个指针,一个指向对象,一个指向成员函数:

代码语言:javascript
复制
void (RTSPClient::*mfptr) = &RTSPClient::continueAfterDESCRIBE;

一个对一个物体:

代码语言:javascript
复制
RTSPClient* p = new RTSPClient();

然后称之为:

代码语言:javascript
复制
p->*mfptr(...);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27045304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档