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); // 使用对象指针调用成员函数
?通过将对象指针传递给静态回调函数,并在静态回调函数中使用对象指针来调用成员函数,您应该能够正确地调用成员函数指针并传递自身作为参数。