且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

将指向类成员函数的指针作为参数传递

更新时间:2021-11-08 00:34:28

您不能将函数指针转换为 void *

You cannot cast a function pointer to void*.

如果你想要一个函数指针指向一个成员函数,你必须声明类型为

If you want a function pointer to point to a member function you must declare the type as

ReturnType (ClassType::*)(ParameterTypes...)

此外,您不能声明一个指向绑定成员函数的函数指针,例如

Further you cannot declare a function pointer to a bound member function, e.g.

func_ptr p = &t1.get_pc // Error

而您必须取得如下地址:

Instead you must get the address like this:

func_ptr p = &test::get_pc // Ok, using class scope.

最后,当调用指向成员函数的函数指针时,与该函数是其成员的类的实例。例如:

Finally, when you make a call to a function pointer pointing to a member function, you must call it with an instance of the class that the function is a member of. For instance:

(this->*cb_func)(); // Call function via pointer to current instance.






下面是应用所有更改的完整示例: / p>


Here's the full example with all changes applied:

#include <iostream>

class test {
public:
    typedef void (test::*callback_func_ptr)();
    callback_func_ptr cb_func;
    void get_pc();
    void set_cb_ptr(callback_func_ptr ptr);
    void call_cb_func();
};

void test::get_pc() {
    std::cout << "PC" << std::endl;
}

void test::set_cb_ptr(callback_func_ptr ptr) {
    cb_func = ptr;
}

void test::call_cb_func() {
    (this->*cb_func)();
}

int main() {
    test t1;
    t1.set_cb_ptr(&test::get_pc);
    t1.call_cb_func();
}