|
C++静态函数指针的问题
问题: static int reactor_accept_cb 最后一个参数是自身, 调用的时候如果 (*ud->accept_cb)(fd, 0, r, this ); 编译不通过, 该怎么处理?
class tcp_server;
typedef int (tcp_server::*EVENT_CALLBACK)(int fd, int events, void* args); // 函数指针
class tcp_server
{
public:
//构造函数
tcp_server(const char *ip, uint16_t port);
//开始提供创建链接的服务
void do_accept(int fd, int event_type, void* args);
int reactor_accept_cb(int fd, int events, void* args);
int reactor_read_cb(int fd, int events, void* args);
int reactor_write_cb(int fd, int events, void* args);
static int reactor_accept_cb(int fd, int events, void* args, tcp_server* self); // 静态函数指针
static int reactor_read_cb(int fd, int events, void* args, tcp_server* self); // 静态函数指针
static int reactor_write_cb(int fd, int events, void* args, tcp_server* self); // 静态函数指针
// 调用:
if (ACCEPT_EVENT == ud->events) {
// ud->accept_cb(fd, 0, r,this);
(this->*ud->accept_cb)(fd, 0, r); // 这里可以编译通过,运行没拿到 fd, 好像和 static int reactor_accept_cb 函数没任何关系
} 问题出在您在调用时使用了 `(*ud->accept_cb)(fd, 0, r, this)` ,这样的语法是不正确的。因为 `accept_cb` 是一个成员函数指针,它需要通过对象来调用。正确的调用方式应该是 `(this->*ud->accept_cb)(fd, 0, r)` 。
在成员函数指针的调用中,需要使用对象指针( `this` )来调用成员函数。您可以通过将对象指针作为参数传递给静态回调函数,然后在静态回调函数中使用对象指针来调用成员函数。
以下是一个示例,展示了如何正确调用成员函数指针:
- class tcp_server {
- public:
- // ...
- static int reactor_accept_cb(int fd, int events, void* args, tcp_server* self) {
- return (self->*self->accept_cb)(fd, events, args); // 使用对象指针调用成员函数
- }
- // ...
- };
- // 调用:
- (this->*ud->accept_cb)(fd, 0, r); // 使用对象指针调用成员函数
复制代码 通过将对象指针传递给静态回调函数,并在静态回调函数中使用对象指针来调用成员函数,您应该能够正确地调用成员函数指针并传递自身作为参数。
|
|