c++中怎么自定义事件监听(回调函数)

废话不多说,上代码:

#include <iostream>
#include <vector>
using namespace std;
class A 
{
private:
    int a = 5;
    vector<void(*)(int)> funcs;
public:
    void setA(int a_);
    void registerCallback(void(*p)(int));
};

void display(int a) 
{
    cout << "a=" << a << endl;
}

int main()
{
    A a1;
    a1.registerCallback(display);
    a1.setA(7);
    system("pause");
    return 0;
}

void A::setA(int a_)
{
    a = a_;
    for (int i = 0; i < funcs.size(); ++i) {
        funcs[i](a);
    }
}

void A::registerCallback(void(*p)(int))
{
    funcs.push_back(p);
}

运行结果:

c++中怎么自定义事件监听(回调函数)

这里用到了函数指针(即指向函数的指针),我们要监听A类中的成员变量a,我们定义A类的时候就增加一个将来要监听a变量的函数指针列表,并增加一个registerCallback函数用于将来添加监听者,在a变化时将监听者列表里的所有监听者都调用一遍;在使用A类对象时,我们只要把一个返回类型、参数列表(签名)符合的函数添加为回调函数即可,如上面当我们运行a1.setA(7)改变a的值时,就会调用了回调函数display,这就差不多是事件监听的思想:首先订阅事件(如这里的把display函数注册为回调函数),然后当事件(这里是a的值变化了)发生时,就会自动调用回调函数实现监听。c#里的delegation和java里的listener大概也就是这样,但可能会更复杂一点。