C++ 中回调函数详解及简单实例

C++ 中回调函数详解及简单实例

回调函数调用关系图

对于第一种情况,主程序可以从执行到回调函数,也可以不执行回调函数,关键看宿主函数是否调用了回调函数。

对于第二种情况,主程序可以从执行到回调函数,也可以不执行回调函数,关键看宿主函数是否调用了回调函数。主程序不知道宿主函数什么时候调用回调函数,因为调用函数启动了线程,这样,主程序就不必关心宿主函数什么时候调用回调函数了,主程序可以释放出来做自己的事了。

代码示例

#include <stdio.h> 

typedef void(*lpFunc)(void *, char *);  // 函数指针
// 回调函数的宿主函数,在这里回调用函数被使用,
void GetCallBack(void * lpVoid, lpFunc callback)
{
    callback(lpVoid, "test");
} 

class A{
public:
    A(){}; 

    void outName(char szAlarm[]){
       printf("my name is %s /n", szAlarm);
    } 

    // 被宿主调用的回调函数
    static void fCallback(void *lpVoid, char szAlarm[]){
       A * p = (A*)(lpVoid);
       p->outName(szAlarm);
    } 

    //调用外部宿主函数,当Test函数调用过宿主函数以后,Test就再也不关心宿主函数
    //什么时候调用回调函数了,因为那时宿主函数自己的事了
    void Test(){
       GetCallBack(this, fCallback);
    }
}; 

int main(void)
{
    A a;
    a.Test();
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++基础入门教程(九):函数指针之回调

    在Java,要实现某个时间调用某段代码,是很简单的事情,那就是使用接口. 而在C++里,有一个比较高深的方式,那就是使用函数指针. 比如Cocos2d-x的定时器(schedule).消息订阅(NotificationCenter)都使用了函数指针来完成回调的功能. 这也是为什么我们总是能把某个函数作为参数传进去,然后在某个时刻这个函数会被调用. 一.函数的地址 要获取一个int变量的地址很简单,比如int num; 那么num的地址就是&num. 而获取函数的地址更简单,函数的名字就是函数的地

  • C++中如何实现回调的方法示例

    前言 C++中使用class语法实现回调(当然,,旧式的C函数指针回调也是支持的) 比如,有人提供一个类库 AfCopyFile,能够提供文件拷贝的功能,而且能通知用户当前的进度... int DoCopy(const char* source, const char* dst, AfCopyFileListener* listener); 用户只需要自己实现一个AfCopyFileListener对象,传给这个函数就行... class MainJob : public AfCopyFileL

  • C++中回调函数(CallBack)的用法分析

    本文实例分析了C++中回调函数(CallBack)的用法.分享给大家供大家参考.具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时

  • c++回调之利用sink示例

    复制代码 代码如下: // cbBysink.cpp : Defines the entry point for the console application.// #include "stdafx.h"#include "cbBysink.h" /************************************************************************//*                上层回调函数            

  • c++回调之利用函数指针示例

    c++回调之利用函数指针示例 复制代码 代码如下: #include <iostream>using namespace std; /************************************************************************//*                下层实现: CALLBACK                                        *//**********************************

  • 在c和c++中实现函数回调

    将函数指针作为结构体成员,可以实现函数注册和回调 复制代码 代码如下: struct T{ void (*callback)(char *);};void doSomething(char *job){ //TODO...}int main(){ T t; t.func = doSomething; //调用回调函数 t.func("something"); return 0;}

  • c++函数指针和回调函数示例

    1.函数指针 函数指针是一个指针,只是这个指针它不像普通的指针指向是是一个变量,此时它指向的是一个函数,也就是它存储的是一个函数的地址,如果我们改变它的值,让它所指向的地址由指向funA转变为指向funB,那么这个函数指针的作用就改变了. 2.回调函数 什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,这就是回调机制.B函数就是回调函数. 3.函数指针的使用 3.1函数指针声明 typedef

  • C/C++回调函数介绍

    对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理.本文将要解释什么是回调函数.它们有什么好处.为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针. 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制

  • C++ 中回调函数详解及简单实例

    C++ 中回调函数详解及简单实例 回调函数调用关系图 对于第一种情况,主程序可以从执行到回调函数,也可以不执行回调函数,关键看宿主函数是否调用了回调函数. 对于第二种情况,主程序可以从执行到回调函数,也可以不执行回调函数,关键看宿主函数是否调用了回调函数.主程序不知道宿主函数什么时候调用回调函数,因为调用函数启动了线程,这样,主程序就不必关心宿主函数什么时候调用回调函数了,主程序可以释放出来做自己的事了. 代码示例 #include <stdio.h> typedef void(*lpFunc

  • linux 中open()函数详解及简单实例

    open()函数创建文件时便捷的权限设置 头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 函数原型 int open( const char * pathname, int flags); int open( const char * pathname,int flags, mode_t mode); 当flags参数包含O_REEAT时,需要对mode参数进行指定 S_IRWXU,

  • 微信小程序中input标签详解及简单实例

    微信小程序中input标签详解及简单实例 使用input标签,我们都会,在微信小程序中使用,必定也是可以一下子就会的,但是却有些常用的属性无法按照习惯去使用: 我就用我最常用的来做例子: 一个一个来解读: 首先,我是定义了他的id,这是我们最常用的,所以就配了一个id,毕竟不操作他,又为什么设成输入框呢, 第二,设置他的样式, 第三,设置他的输入类别,以上都是很简单的 第四.使用正则l:哎限定输入为纯数字.这点可能有点不理解,这是对他的keyup事件监听,将不是纯数字的list无视掉.注意,是对

  • C语言中getch()函数详解及简单实例

    C语言中getch()函数详解及简单实例 前言: 这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! 所以有这样的一个接口,那就很牛逼了,至少可以做个游戏来玩下,结合ASCII码,很容易写个方向键控制的2048或者贪吃蛇等等有趣的游戏出来. 以下是以一个简单的例子: 你会发现当你按下对应的按键的时候就会打印相应的语句. #include <stdio.h> #include <fcnt

  • java 中cookie的详解及简单实例

    java 中cookie的详解 Java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题. 建立一个无生命周期的cookie,即随着浏览器的关闭即消失的cookie,代码如下 HttpServletRequest request HttpServletResponse response Cookie cookie = new Cookie("cookiename","cookievalue&

  • C++中 STL list详解及简单实例

    C++中 STL list详解 1.List: 内部实现是一个双向链表,可以高效的进行插入删除,但不能够进行随机访问 2..示例程序: #include "stdafx.h" #include <iostream> #include <list> #include <iterator> #include <algorithm> using namespace std; const int num[5] = {1,3,2,4,5}; boo

  • Java中的泛型方法详解及简单实例

      java 泛型方法: 泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类型,例如:Test<Object> t = new Test<Object>();,指明泛型T的类型为Object. 但是Java中的泛型方法就比较复杂了. 泛型类,是在实例化类的时候指明泛型的具体类型:泛型方法,是在调用方法的时候指明泛型的具体类型.   定

  • Spring中@Async用法详解及简单实例

    Spring中@Async用法 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将完成介绍@Async的用法. 1.  何为异步调用? 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需

  • 微信小程序中的onLoad详解及简单实例

    微信小程序中的onLoad onLoad是一个生命周期函数,表示页面加载 onLoad默认有一个Object类型的参数,是指其他页面打开当前页面所调用的 query 参数 举个栗子~ 当我们在页面first的js脚本中有一个点击方法onTap 当点击时页面跳转到second页面,用?id = secondId的形式为second页面传递一个值(这里的secondId是一个已经获取过的值) onTap: function(){ wx.navigateTo({ url: "second?id=&qu

  • java 中Collection存储器详解及简单实例

    本篇仅为了巩固一下基础,回忆一下存储的这两个常用的东东- 一.Collection 1.存储对象可以考虑:①数组②结合 2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Stutdent();-- 弊端:①一旦创建,其长度不可变 ②真实的数组存放的对象的个数是不可知的 3.集合 Collection接口     丨------List接口:存储有序,可以重复的元素         丨-------ArrayList(主要的实现类,

随机推荐