我在C ++中编写一个简单的套接字服务器。我已经有一些来自C的库,它会在socket上发生事件读取时触发回调。我希望将使用该类的客户端将强制自己的机制来处理这些事件。 我的基类是:
class CBaseServer{
...
void monitorDataArrived(int fd);
virtual void monitorOnDataArrived(void *context, int fd) = 0;
}
每当出现新的套接字时,在此类中指向monitorOnDataArrived(void *context, int fd)
的指针必须传递给名为AddClient(int mask, proc, fd)
的extarnal C函数。 proc
定义为:
typedef void(*proc)(void *context, int fd)
CBaseServer::monitorDataArrived(fd){
proc p = (void (*)(void*, int)&CBase::monitorOnDataArrived;
addClient(MASK_READ, p, fd);
}
现在客户正在做:
class Reader : class CBase{
void monitorOnDataArrived(void *context, int fd) {
std::cout << "hey, data arrived"
}
}
我的问题是:我有恭维错误:undefined refernece to CBaseServer::monitorOnDataArrived(void *, int)
有什么办法可以解决吗?
问候 学家
答案 0 :(得分:3)
你误解了C ++中的函数指针。
您不能将成员函数传递给C处理程序,因为成员函数有一个额外的隐式参数(&#34; this&#34;参数)。
解决方案是什么?解决方案是使用静态函数将void * context参数强制转换为基类的实例,然后调用虚函数:
class CBaseServer{
...
//Watch that the context parameter has been moved from the virtual to the other
//function, which is now also static.
static void monitorDataArrived(void *context, int fd);
virtual void monitorOnDataArrived(int fd) = 0;
}
调度代码如下:
void CBaseServer::monitorDataArrived(void *context, int fd){
CBaseServer * server=(CBaseServer*)context;
server->monitorOnDataArrived(fd);
}
注册码为:
class Reader : class CBase{
void monitorOnDataArrived(int fd) {
std::cout << "hey, data arrived"
}
}
....
Reader * theReader=new Reader();
//The instance theReader of type Reader must be passed to the registration function
//as the void * context parameter.
addClient(MASK_READ, &theReader);