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大概也就是这样,但可能会更复杂一点。

原文地址:https://www.cnblogs.com/blog-vincent-0x1F7/p/9668503.html

时间: 2024-10-07 13:45:40

c++中怎么自定义事件监听(回调函数)的相关文章

JavaScript自定义事件监听

一.事件的属性和方法 1 //事件Event 2 //属性:` 3 `bubbles`:布尔值,是否会冒泡 4 `cancelable`:布尔值,是否可以取消默认动作 5 `target`:目标对象 6 `currentTarget`:当前对象 7 `timeStamp`:时间戳(相对于某个时刻) 8 `type`:事件类型,即注册该事件的名字 9 `eventPhase`:返回事件传播的当前阶段 10 11 12 //方法 13 1.event.stopPropagation(); 阻止冒泡

cocos2d-js 自定义事件监听派发

熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法. cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyReleased: function(keyCode, event) { if (keyCode == cc.KEY.back) { cc.director.end(); } }}, th

Java Spring 自定义事件监听

ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextStartedEvent; public class EventStart implements ApplicationListener<ContextStartedEvent>{ @Override pub

JAVA中按钮的事件监听的三种方式

JAVA中的Swing组件,按钮的重点是进行事件的监听,可以通过调用JButton的addActionListener()方法.这个方法接受一个实现ActionListener接口的对象作为参数,ActionListener接口中只包含一个actionPerformed()方法,所以如果想把事件处理的代码与JButton进行关联,就需要如下的三种做法: 第一种: public class Button extends MyFrame {    private JButton        b1

JAVA自定义事件监听完整例子---sunfruit[转]

http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f733628a854d2c90c05f93130716017bb2e1707e4e5f8099297a52ef0f07bbae61332a032ab59bc2835dddccc86e70d633712d5cd04e4a805dfcdc4654d651e34d98af0e97cbe746e4b9d3a3c82551dd27736df6f59c2c01&p=9

java中的key事件监听机制

package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; public class TestKey { public static void main(String[] args) { JFrame f = new JFrame(); f.addKeyListener(new MyKeyListener()); f.setVisib

javascript中通用的事件侦听器函数

var EventUtil = { addHandler:function (element, type, handler) { if(element.addEventListener){ element.addEventListener(type,handler,false) }else if(element.attachEvent){ element.attachEvent('on'+type,handler) }else { element['on'+type] = handler; }

基于CSS class的事件监听管理机制 (转)

背景: 做了那么多web项目,总会发现到处都是事件绑定,同一个按钮的执行动作,也许会分布在多个js文件中. 而且对于js动态生成的文档片段,里面会经常出现“onclick=...”之类的代码,一到功能升级,或者代码重构的时候, 就会发现,这个难度以及工作量,和重写一遍没什么区别,有时候甚至工作量更大! 基于各种情况的分析.以及以往的经验总结,百度空间则有了一套自己的事件监听管理机制:基于CSS class的事件监听管理机制 方案: 1.js代码中,不出现对某节点的事件监听,如:$('#elm')

Spring Boot实践——事件监听

借鉴:https://blog.csdn.net/Harry_ZH_Wang/article/details/79691994 https://blog.csdn.net/ignorewho/article/details/80702827     https://www.jianshu.com/p/edd4cb960da7 事件监听介绍 Spring提供5种标准的事件监听: 上下文更新事件(ContextRefreshedEvent):该事件会在ApplicationContext被初始化或者