c++虚方法指针

C++ virtual method pointer

本文关键字:指针 方法 c++      更新时间:2023-10-16

我正在用c++写一个简单的套接字服务器。我已经从C中获得了一些库,当事件读取发生在套接字上时触发回调。我希望客户端谁将使用该类将实现自己的机制来处理这些事件。我的基类是:

class CBaseServer{
    ...
    void monitorDataArrived(int fd);
    virtual void monitorOnDataArrived(void *context, int fd) = 0;
}
当出现新的套接字时,该类中指向monitorOnDataArrived(void *context, int fd)

指针必须传递给称为AddClient(int mask, proc, fd)的外部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)

有办法解决吗?

的问候j .

你误解了c++中的函数指针。

不能将成员函数传递给C处理程序,因为成员函数有一个额外的隐式形参("this"形参)。

解决方案是什么?解决方案是使用静态函数,它将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);