回调函数的使用方法(类之间的通信)

// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <functional>
using namespace std;

//1 "方向盘" 类接收外部的操作, 把消息传到 "车" 类中, 车类把消息传入到 "轮子" 类上
//(子类发消息给父类)

//2 "方向盘" 类接收外部的操作, 把消息传入到 "轮子" 类上
//(子类发消息给子类)

//方向盘类
class Steering
{
private:
	function<void(float)> m_steeringAction;
public:
	//设置回调函数
	void setWheelConnectWithCar(function<void(float)> steeringAction)
	{
		m_steeringAction = steeringAction;
	}

	//转动方向盘
	void turn(float angle)
	{
		cout<<"Steering turn "<<angle<<" angle"<<endl;

		m_steeringAction(angle);
	}

};
//轮子类
class  Wheel
{
public:
	//转动轮子方向
	void turn(float angle)
	{
		cout<<"Wheel turn "<<angle<<" angle"<<endl;
	}
};

//车类
class Car
{
public:
	//尽管方向盘在车里, 可是用户能够直接对它进行操作
	Steering m_steering;
	Wheel m_wheel;

	Car()
	{
		setCarConnectWithWheel();
	}
#if 1//1 "方向盘" 类接收外部的操作, 把消息传到 "车" 类中, 车类把消息传入到 "轮子" 类上
	//设置车和方向盘连接的函数
	void setCarConnectWithWheel()
	{
		std::function<void (float)> _fun = std::bind(&Car::steeringAction,this,std::placeholders::_1);
		m_steering.setWheelConnectWithCar(_fun);
	}

	//当转动方向盘时, 会调用该函数, 然后改函数让轮子转动对应的角度
	void steeringAction(float angle)
	{
		m_wheel.turn(angle);
	}
#else//2 "方向盘" 类接收外部的操作, 把消息传入到 "轮子" 类上
	//设置车和方向盘连接的函数
	void setCarConnectWithWheel()
	{
		std::function<void (float)> _fun = std::bind(&Wheel::turn,&m_wheel,std::placeholders::_1);
		m_steering.setWheelConnectWithCar(_fun);
	}
#endif

};

int _tmain(int argc, _TCHAR* argv[])
{
	Car _car;
	//让方向盘转动30度
	_car.m_steering.turn(30);
	return 0;
}
时间: 2024-10-25 06:18:24

回调函数的使用方法(类之间的通信)的相关文章

PHP回调函数的实现方法 (转)

全局回调函数: 这里的全局函数的意思,是直接使用function定义的函数,它不包含在任何对象或类之中.请看下面的例子. 示例代码: function fnCallBack( $msg1 , $msg2 ) { echo 'msg1:'.$msg1; echo "<br />n"; echo 'msg2:'.$msg2; } $fnName = "fnCallBack"; $params = array( 'hello' , 'world' ); cal

回调函数的用法(类之间的通信)

// ConsoleApplication3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <functional> using namespace std; //1 "方向盘" 类接收外部的操作, 把消息传到 "车" 类中, 车类把消息传入到 "轮子" 类上 //(子类发消息给父类) //2 "

回调函数在replace方法中的应用

处理字符串是项目中经常会遇到的问题,对于长度比较大的字符串如何作一次性处理是需要我们去考虑的,这里给个例子: 把字符串"get-element-by-id"变成"getElementById": 方法一: var a = "get-by-element-by-id"; var b = a.split("-") for(var i = 1 ;i<b.length;i++){ b[i].charAt(0).toUpperCa

类内定义线程的回调函数问题

C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象.函数体可以通过显示调用该指针或直接访问类内成员.      回调函数是用指针来调用的函数,最常使用的回调函数就是在创建线程时,以一个函数指针以及传递给这个函数多个参数来调用线程函数来创建线程.那么一般的类成员函数是不能用作回调函数的,因为库函数在使用回调函数时,都会传递指定的符合回调函数声明的的参数给回调函数,而类成员函数隐式包含一个this指针参数,所以把类成员函数当作回调函数编译时因为参数不匹配会出错.

类成员函数可以为回调函数吗

关于类成员函数是否可以成为回调函数,我们首先需要明确几个定义,1. 什么是回调函数 2. 为什么要使用回调函数 3. 调用普通类成员函数和调用回调函数有什么区别 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int

回调函数设计方法

引入: 你显示器不亮了,你不知道怎么弄,那你就问在外地干IT的大表哥,你大表哥告诉你修理的方法,然后需要你自己来操作. 你大表哥知道怎么弄,但是自己不去弄,而是由你去弄. 换句话说,你大表哥实现了修理你显示器的方法,但他不会自己去调用,而是由你去调用.那么你大表哥告诉你的修机器的方法就是回调函数. 在这个比喻里,你自己 作为主调方,有实际的需求--修显示器,但是没有方法,求教表哥的时候,表哥给你的方法 就是一个 函数地址,当你按照大表哥的方法执行的时候,就是 执行了一个回调函数了. 在工程设计中

js中的回调函数的理解和使用方法

一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上是一种对象,它可以存储在变量中,通过参数传递给另一个函数,在函数内部创建,从函数中返回结果值",因为函数是内置对象,我们可以将它作为参数传递给另一个函数,到函数中执行,甚至执行后将它返回,它一直被"专业的程序员"看作是一种难懂的技术. 回调函数的英文解释为: A callback is a functi

回调函数与PHP实例

1 什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通

回调函数的原理及PHP实例

背景:在最近的一个开发项目中,用户要先调用服务才能开始进行一系列的查询活动,想了好久,经同事提醒, 用回调函数即可解决该问题.在这里,对PHP下回调函数的原理及实现分别做一下讲解. 1 什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它的调用方向刚好