C++静态函数指针的问题

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); // 使用对象指针调用成员函数

 通过将对象指针传递给静态回调函数,并在静态回调函数中使用对象指针来调用成员函数,您应该能够正确地调用成员函数指针并传递自身作为参数。

具体详细页面查看

你可能感兴趣的:(c++,开发语言)