如何添加/设计回调函数

2023-12-21

如何在 C++ 中设置/注册回调函数,以便在从队列中读取数据时调用函数?

Edit 1:

使用尼尔的答案作为完整的答案(在头文件中):

#include <vector.h>

class QueueListener {
   public:
       virtual void DataReady(class MyQueue *q) = 0;
       virtual ~QueueListener() {}
};

class MyQueue {
   public:
       void Add (int x) {
          theQueue.push_back(x);
          for (int i = 0; i < theCallBacks.size(); i++) {
             theCallBacks[i]->DataReady(this);
          }
       }

       void Register (QueueListener *ql) {
            theCallBacks.push_back(ql);
       }


   private:
       vector <QueueListener *> theCallBacks;
       vector <int> theQueue;
};



class MyListener : public QueueListener {
   public:
       virtual ~MyListener () {
          printf("MyListener destructor!");
       }
       MyListener(MyQueue *q);
       virtual void DataReady(class MyQueue *p);
};

和注册:

#include "File1.h"


MyListener::MyListener(MyQueue *q)
{
   q->Register(this);
}

void MyListener::DataReady(class MyQueue *p)
{
   Sleep(500);
}

然后调用:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    MyQueue *q = new MyQueue();
    MyListener ml(q);

    q->Add(1);

}

概括地说,创建一个 QueueListener 基类:

class QueueListener {
   public:
       virtual void DataReady( class MyQueue & q ) = 0;
       virtual ~QueueListener() {}
};

和一个队列类(以整数队列为例:

class MyQueue {

   public:
      void Add( int x ) {
          theQueue.push_back( x );
          for ( int i = 0; i < theCallBacks.size(); i++ ) {
              theCallBacks[i]->DataReady( * this );
          }
      }

      void Register( QueueListener * ql ) {
          theCallBacks.push_back( ql );
      }

  private:

    vector <QueueListener *> theCallBacks;
    SomeQueueType <int> theQueue;

};

您派生想要从 QueueListener 回调的类并实现 DataReady 函数。然后,您可以使用队列实例注册派生类的实例。

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

如何添加/设计回调函数 的相关文章

随机推荐

  • 替换列值

    我有这张桌子 Name Rating A 2 B 1 C 5 D 3 E 1 F 4 我有一个评级系统 1 Excellent 2 Very Good 3 Good 4 OK 5 Poor 我想知道是否可以替换表中的数值以获得以下结果表 N
  • Python 3.6 datetime.fromtimestamp 在给定 0 时抛出错误

    在 Python 3 5 2 中 这是有效的 datetime datetime fromtimestamp 0 returns gt datetime datetime 1970 1 1 1 0 然而 在 Python 3 6 中 我得到
  • Flutter Web 监听通过 iFrame 发布的事件

    我的目标是集成一个 flutter 小部件在一个人的帮助下iframe在我的主页上 主页不是用flutter写的 但是 我需要一个界面 通过它主页可以与小部件通信 所以我想到使用发布消息 在主页上和html window addEventL
  • 如何将 g:link 合并到普通按钮中?

    In my grails应用程序有一个view与一个g link标签 它工作正常 但视觉效果有点尴尬 因此 我想掩饰这一点g link用一个普通的按钮 我尝试过一个span class and input type button 但这并没有
  • unordered_map vs map vs array - 内存分析

    正如标题所说 我想知道之间的内存差异unordered map map and array Example unordered map
  • 为什么抛出局部变量调用移动构造函数?

    最近 我 玩弄 了右值来理解它们的行为 大多数结果并不让我感到惊讶 但后来我发现 如果我抛出一个局部变量 则会调用移动构造函数 在那之前 我认为移动语义规则的目的是保证仅当编译器可以检测到该对象将不再被使用 如在临时对象中 时才会移动 并变
  • 如何在 Seaborn distplot 中绘制 Pandas 日期时间系列?

    我有一个带有日期时间列的熊猫数据框 我想根据该日期列绘制行的分布 但我目前收到一个无用的错误 我有 df Date pd to datetime df Date errors raise s sns distplot df Date 这会引
  • 模板引用变量中的 ref- 前缀和 # 有什么区别(Angular 2)

    我想了解输入文本框中下面提到的模板引用变量符 号之间的区别
  • 如何将手势从 UITextView 传递到 UICollectionViewCell

    我有一个水平滚动的 UICollectionView 和包含 UITextView 的 UICollectionViewCells 有什么方法可以将 textview 上的手势传递给单元格 以便调用 didSelectItemAtIndex
  • 来自 GitHub 的 Grails 插件

    如果我想使用来自 Git Hub 的 Grails 插件 我是否只需下载 zip 文件并使其在本地 Maven 存储库中可用 我位于防火墙后面 这不允许我解决依赖关系 您可以获取源并运行maven install要使其在本地 Maven 存
  • scikit-learn 的 KNN 如何计算概率估计?

    scikit learn中KNN算法的实现是如何计算概率估计的predict proba X method 以下示例摘自 sklearn 文档 但进行了一些修改 以便您可以理解我们在这种情况下做什么 有关更多详细信息 请参见 https s
  • 自定义颤振小部件形状

    我正在尝试在 Flutter 中构建以下布局 我希望实现两件事 渲染绘制对角线的背景 我猜是通过 BoxDecoration 让粉色容器沿着对角线夹住子项 即 如果文本对于一行来说太大 则应换行到新行 有任何想法吗 这是我的代码 Stack
  • 如何部署我的 Windows Phone 8.1 应用程序?

    我刚刚使用 update 2 RC 更新了我的 Visual Studio Professional 2013 我做了一个简单的应用程序来尝试 我选择发布并单击项目中的构建按钮 但它不适用于创建 xxxx appx 文件 它正在创建 xxx
  • python - 将列表a中的每个元素与列表b相乘并相加

    功能 def unique common a b 我有两个清单 可以说 a 2 3 5 7 9 和另一个清单 b 5 8 4 1 11 此列表 b 为您提供与第一个列表 a 对应的每件商品的单件价格 例如 如果您要购买 2 单位的第一项商品
  • Flash 内容的 IE7 z-index 问题

    我遇到了 IE7 中的 Flash 内容始终位于菜单项上方的问题 我有如下结构 div div div ul li foo li li bar li ul div 现在 菜单的最后一项打开 它显示在 Flash 内容后面 摩天大楼位于页面内
  • Jquery阅读文章内容之间的位置进度

    在这个例子中http jsfiddle net SnJXQ 61 http jsfiddle net SnJXQ 61 阅读进度指示器 但它的宽度从网站顶部开始增加 但我们需要进度条宽度开始增加 当文章内容 div 到达文章内容末尾时 这是
  • Google Cloud Datastore 与 Google App Engine

    我正在查看新的 Google Cloud Datastore 看起来很棒 但有一些我无法理解的事情 它应该取代 Google App Engine 数据存储吗 如何在 GAE 中使用它 他们两者有什么区别呢 我有一个 Java 中的 GAE
  • 更新 Google App Engine 上数据存储区中的大量实体

    我想对特定类型的所有实体执行一个小操作并将它们重写到数据存储中 我目前有 20 000 个此类实体 但想要一个可以扩展到任意数量的解决方案 我有什么选择 Use a mapper http code google com p appengi
  • 如何在Chrome开发工具中返回当前调试位置?

    我不断发现代码在 Chrome 调试器中的断点处停止的情况 然后当我使用 控制台 等另一个选项卡并返回 源 时 我丢失了代码停止的位置 我必须单击单步 回到正轨 但这会跳过所寻求的断点 有没有办法到达调试器停止的地方 您可以通过单击调用堆栈
  • 如何添加/设计回调函数

    如何在 C 中设置 注册回调函数 以便在从队列中读取数据时调用函数 Edit 1 使用尼尔的答案作为完整的答案 在头文件中 include