gpt4 book ai didi

C++虚方法指针

转载 作者:行者123 更新时间:2023-11-28 00:27:01 24 4
gpt4 key购买 nike

我正在用 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 函数,无论何时将出现新的 socket 。 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++虚方法指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24572856/

24 4 0
文章推荐: html - 我想将一个 css 三 Angular 形定位为背景
文章推荐: c++ - C++ 中基于前向的光线追踪器
文章推荐: c++ - MFC 中非动态 Doc/View 体系结构的使用
文章推荐: html - 如何将
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com