c++ 实现信号和槽机制

2023-11-09

    主要通过,c++实现类型QT 信号和槽的问题

    设计思路:

    1、利于模板函数和模板类的,通用性

    2、BInd的时候,讲槽函数指针保存,触发时调用

    代码如下:

   

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

#define Connect(sender, signal, receiver, method) ((sender)->signal.Bind(receiver, method))
/*
* func: 槽函数基类
* parm:
* return:
*/
template<class T>
class SlotBase
{
public:
    virtual void Exec(T param1) = 0;  //纯虚函数
    virtual ~SlotBase(){}
};


/*
* func: 槽函数
* parm:
* return:
*/
template<class T, class T1>
class Slot : public SlotBase<T1>
{
public:

    /* 定义Slot的时候,获取槽函数信息 */
    Slot(T* pObj, void (T::*func)(T1))
    {
        m_pSlotBase = pObj;
        m_Func = func;
    }

    /* signal触发时,调用 */
    void Exec(T1 param1)
    {
        (m_pSlotBase->*m_Func)(param1);
    }

private:
    /* 槽函数信息 暂存 */
    T* m_pSlotBase = NULL;
    void (T::*m_Func)(T1);
};

/*
* func: 信号
* parm:
* return:
*/
template<class T1>
class Signal
{
public:

    /* 模板函数 -> Bind时获取槽函数指针 */
    template<class T>
    void Bind(T* pObj, void (T::*func)(T1))
    {
        m_pSlotSet.push_back(new Slot<T,T1>(pObj,func));
    }

    /* 重载操作符 -> signal触发机制 */
    void operator()(T1 param1)
    {
        for(int i=0;i<(int)m_pSlotSet.size();i++)
        {
            m_pSlotSet[i]->Exec(param1);
        }
    }

    ~Signal()
    {
        for(int i=0;i<(int)m_pSlotSet.size();i++)
        {
            delete m_pSlotSet[i];
        }
    }

private:
    vector<SlotBase<T1>*> m_pSlotSet; //这一句很重要,靠基类的指针来存储 信号槽指针
};




class TestFunc1
{
public:
    void FuncOfA(int parm)
    {
        printf("enter FuncOfA parm = %d\n", parm);
    }
};
class TestFunc2
{
public:
    void FuncOfB(int parm)
    {
        printf("enter FuncOfB parm = %d\n", parm);
    }
};


class TestSignal
{
public:
    TestSignal()
    {
    }
    void emit(int value)
    {
        ValueChanged(value);
    }

public:
    Signal<int> ValueChanged;


};

int main()
{
    /* 1、定义信号和槽 */
    TestFunc1* pFunc1 = new TestFunc1;
    TestFunc2* pFunc2 = new TestFunc2;
    TestSignal* pSignal = new TestSignal;

    /* 2、1个信号绑定2个槽 */
    Connect(pSignal, ValueChanged, pFunc1, &TestFunc1::FuncOfA);
    Connect(pSignal, ValueChanged, pFunc2, &TestFunc2::FuncOfB);

    /* 3、触发信号 */
    pSignal->emit(1);
    pSignal->emit(2);



    delete pFunc1;
    delete pFunc2;
    delete pSignal;

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 实现信号和槽机制 的相关文章

  • 随手记怎么样靠谱吗?随手记平台不触碰用户资金

    随着经济的快速发展和人们理财意识的增强 互联网理财在人们的日常生活中逐步普及 而随手记作为随手集团旗下集手机记账 财务规划 金融服务 社区投资者教育等功能于一体的个人财务管理和金融服务品牌 其推出的理财产品受到不少理财投资者的青睐 但是 随
  • 什么是渲染目标(render target)&& 渲染到纹理(Render To Texture, RTT)详解

    渲染到纹理 Render To Texture RTT 详解 RTT是现在很多特效里面都会用到的一项很基本的技术 实现起来很简单 也很重要 但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿 不知道是因为太简单还是因为这项技术已经出现
  • docker安装觅思文档(mrdoc)

    mrdoc文档地址 https mrdoc fun doc 18 mrdoc项目地址 GitHub zmister2016 MrDoc mrdoc online document system developed based on pyth
  • STM32逆变器控制

    ADC引脚分配 直流电压 Vc1 PA0 Vc2 PA1 电网电压 U1 V1 W1 AD7323 PB3 PB4 PB5 逆变器输出电压 UCA UCB UCC AD7323 PB13 PB14 PB15 电容电流采样 ICa ICb I

随机推荐

  • Mybatis解释及Mybatis项目搭建

    一 什么是Mybatis MyBatis是一个持久层框架 属于JDBC的替代方案之一 他的前身是iBatis 它属于ORM关系型映射 ORM O R Mapping 对象关系映射 是一种把内存中的对象保存到关系型数据库的技术 用它封装数据库
  • jmeter报错:jmeter java.net.SocketException: Connection reset

    jmeter java net SocketException Connection reset 网络慢 导致
  • HBuilder mui登录和访问控制教程

    HBuilder mui登录和访问控制教程 mui中提供了登录的模板页 但是对于登录后各个页面的访问控制 刷新等并没有官方的推荐方案 我在这里简单说一种初级的解决方案吧 肯定有不足指出 欢迎批评指正 第一节中创建移动APP项目的时候选择的是
  • micropython 通过spi驱动LCD显示屏

    我呢一直对电路设计和程序设计有非常大的爱好 不好说有多精通 纯属个人弄着玩的 所以后面有时间可以和大家一起来交流一下 另外最近也接触了一些PCB 所以一些开发板之类的都自己设计制作了 今天讲的是通过micropython来驱动LCD显示 用
  • 解决数据库死锁现象

    解决数据库死锁现象 一 日志情况 日志情况如下 信息 At least one JAR was scanned for TLDs yet contained no TLDs Enable debug logging for this log
  • JS函数 ,变量

    6函数 6 1函数的概念 大事化小 将复杂的问题简单化 如何大事化小呢 通过函数 为什么需要有函数 首先看一下输出100以内所有素数的解决方案 方案一 循环嵌套 var n Number prompt 请输入一个自然数 var m Math
  • Microsoft Office 2016(ProPlus/Visio/Project) VOL 简体中文版

    Office 2016 专业增强版32 位 文件名 SW DVD5 Office Professional Plus 2016 W32 ChnSimp MLF X20 41351 ISO SHA1 0218F50774AAB63AF7755
  • node中Express的use深入理解

    Express的API 现在学node 不来点Express 都不好意思给人打招呼 但是 我刚接触的时候 觉得好多API 感觉乱糟糟的 没办法 大脑容量不够 不过有一样东西叫地铁 在上面可以让人想清楚很多事情 先来一段最简单的node版he
  • 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    原文见 Understanding TCP Sequence and Acknowledgment Numbers PacketLife net 如果你正在读这篇文章 很可能你对TCP 非著名 的 三次握手 或者说 SYN SYN ACK
  • 系列:4.4、Kubernetes 存储

    Kubernetes 存储 Kubernetes storage存储的相关选项 1 Kubernetes Volumes 由于 Pod 是短暂的 我们有时要求 Pod 上的数据可用于下一个计划的 Pod 或者 有时容器应该在 Pod 中共享
  • 为什么c++输出char类型变量的地址出现的是乱码?

    char a h cout lt lt a 就会出现乱码 h烫烫烫烫篾 看了这个贴 https bbs csdn net topics 310062432 改成printf p a 或者std cout lt lt void a 就可以输出
  • Frida—HOOK 学习笔记2

    Android部分 基础知识 1 安卓分层 简单提一下安卓分层 这个点知道了更好 不知道也无所谓 毕竟我们不是开发 只是为了避免下述情况 我要学习so文件HOOK 一波百度 HOOK so层 之后 出现了一个 native 点进去一看 其内
  • Redis学习笔记(七):底层数据结构和对象

    第一章 数据结构与对象 一 简单动态字符串 SDS 在Redis中默认字符串的表示使用了简单动态字符串 Simple Dynamic String 而没有使用C语言中的传统字符串 字面量 string literal 字面量只用来表示一些无
  • 【RabbitMQ教程】- 实现延时队列

    目录 RabbitMQ实现延时队列 Maven依赖 代码实现 1 插件方式 RabbitMQ实现延时队列 RabbitMQ实现延时队列有两种方式 1 死信队列 2 下载插件 Maven依赖 Maven依赖
  • 力扣(LeetCode)每日一题 1921. 消灭怪物的最大数量

    只需要三个步骤 1 初始化 2 排序 3 遍历 class Solution public int eliminateMaximum int dist int speed 初始化 每个怪物到达城市所需要的回合数目 int times new
  • QEMU-运行一个字符驱动(3)

    上面是我的微信和QQ群 欢迎新朋友的加入 上代码 chardriver c include
  • Web 组件代码示例

    在本文中 我提供了对 Web 组件是什么以及如何使用它们的基本理解 使用现实生活中的示例 我将展示 Web 组件如何帮助使应用程序更可预测和更易于维护 此外 我分享了有关如何通过将 HTML CSS JS 代码隔离为 等待它 隔离的组件以供
  • 二叉查找树 数组实现 ArrayBinarySearchTree

    数组实现的二叉查找树 适用查找操作频繁 插入 删除操作较少的情况 代码 using System namespace DataStructure 数组实现的二叉查找树 输入一个数组 获得一颗二叉查找树 找parent 和 child ind
  • 华为OD机试 - 文件目录大小(Java & JS & Python)

    题目描述 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • c++ 实现信号和槽机制

    主要通过 c 实现类型QT 信号和槽的问题 设计思路 1 利于模板函数和模板类的 通用性 2 BInd的时候 讲槽函数指针保存 触发时调用 代码如下 include