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


    废话不多说,上代码:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 class A 
     5 {
     6 private:
     7     int a = 5;
     8     vector<void(*)(int)> funcs;
     9 public:
    10     void setA(int a_);
    11     void registerCallback(void(*p)(int));
    12 };
    13 
    14 void display(int a) 
    15 {
    16     cout << "a=" << a << endl;
    17 }
    18 
    19 int main()
    20 {
    21     A a1;
    22     a1.registerCallback(display);
    23     a1.setA(7);
    24     system("pause");
    25     return 0;
    26 }
    27 
    28 void A::setA(int a_)
    29 {
    30     a = a_;
    31     for (int i = 0; i < funcs.size(); ++i) {
    32         funcs[i](a);
    33     }
    34 }
    35 
    36 void A::registerCallback(void(*p)(int))
    37 {
    38     funcs.push_back(p);
    39 }

    运行结果:

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

  • 相关阅读:
    Ubuntu “Failed to fetch”错误的解决方法
    #ifndef 与#pragma once
    vs TODO list使用
    window脚本编写bat程序执行
    vtk 的qt插件编译
    git bash 下载加速
    条件欧几里得聚类 pcl::ConditionalEuclideanClustering
    ANY数据类型的使用
    《C#编程风格》还记得多少
    驼峰命名法则
  • 原文地址:https://www.cnblogs.com/blog-vincent-0x1F7/p/9668503.html
Copyright © 2020-2023  润新知