c++虚方法指针
C++ virtual method pointer
我正在用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);
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将成员函数指针作为参数传递给模板方法
- 通过函数指针定义类范围之外的方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 如何访问由共享指针保存的类方法?
- 初始化指向类实例的智能指针并访问其方法
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 有没有将变量名称转换为双指针的简短方法?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 类指针方法崩溃程序
- 证明两指针方法有效(对和)
- Qt 删除指针方法
- 我如何将一些类的指针方法转换为指针函数