回撥函式的用法(類之間的通訊)
阿新 • • 發佈:2019-01-25
// 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; }