天天看點

c++ 函數當參數傳參,類函數當參數傳參,匿名函數當參數傳參,function<void()>                                                                                                函數傳參

                                                                                                函數傳參

一.在URDriver類中調用其它類中的匿名函數 使用function<void()>接收(通過傳函數的方式)

1.1 定義一個類URDriver,類中定義一個接收函數的成員 function<void()> connectCallBack;

1.2 定義一個函數 setConnectCallBack 接收外部傳進來的函數設定到自己類的成員connectCallBack上;

形參格式:function<void()> connectCallBack

1.3 定義一個函數runConnectCallBac執行傳進來的函數

當URDriver類對象執行自己的runConnectCallBack函數後對應傳進來的匿名函數就會執行

class URDriver {
private:

    //用成員接收傳進來的函數
    function<void()> connectCallBack;

public:
   
    //把傳進來的函數指派給成員 function<void()> connectCallBack
    void setConnectCallBack(function<void()> connectCallBack) {
    this->connectCallBack = connectCallBack;
    }

    //調用傳進來的函數
    void runConnectCallBack() {
    this.connectCallBack();
    }

}
           

1.4.把其他類中的匿名函數傳入URDriver類中

 定義一個函數 setCallBack() 調用URDriver類對象中的 setConnectCallBack函數把匿名函數傳入URDriver類成員中

實參格式: [this]{ cout<<"hello word!"<<endl; }

//建立URDriver 對象
URDriver urdsriver;

//使用:在另一個類方法中調用上面的URDriver 對象傳再入匿名函數[this]{}作為URDriver類中成員function<void()> connectCallBack的參數
void MainWindow::setCallBack() {

    //傳入匿名函數
    urdsriver.setConnectCallBack([this]{
        //列印輸出hello word
        cout<<"hello word!"<<endl;
    });
           

二.在自己類中調用其它類中的函數(通過傳函數的方式)

2.1定義一個類PLC_service ,類中定義4個無參函數

#ifndef JIUWU_INNERROOM_IIMTROBOT_PLC_SERVICE_H
#define JIUWU_INNERROOM_IIMTROBOT_PLC_SERVICE_H

#include <IIMTDriver.h>
#include <MoveScript.h>

class PLC_service {
public:
    PLC_service();

    ~PLC_service();

  
    void robot_pick_up_2_to_tray( );

 

    void robot_pick_up_18_to_tray( );


   
    void robot_pick_up_20_to_tray( );

 
  
    void robot_pick_up_26_to_tray( );


};


#endif //JIUWU_INNERROOM_IIMTROBOT_PLC_SERVICE_H

​
           

2.1 定義函數 excuteNextInstruction_Front_4 傳四個PLC_servic類中的無參函數

形參格式:void  (PLC_service::*excute_plcService_function )()

class DriverService {
public:
    DriverService();

    ~DriverService();

    PLC_service plcService;


  //把他類中的函數當做自己函數的參數
        void DriverService::excuteNextInstruction_Front_4(
        void  (PLC_service::*excute_plcService_function1 )()
        ,void  (PLC_service::*excute_plcService_function2 )()
        ,void  (PLC_service::*excute_plcService_function3 )()
        ,void  (PLC_service::*excute_plcService_function4 )()) {
            //執行第1個函數
            (plcService.*excute_plcService_function1)();
            //執行第2個函數
            (plcService.*excute_plcService_function2)();
            //執行第3個函數
            (plcService.*excute_plcService_function3)();
            //執行第4個函數
            (plcService.*excute_plcService_function4)();

}
 
};

};


#endif //JIUWU_INNERROOM_IIMTROBOT_PLC_SERVICE_H




           

2.3【調用函數】 DriverService 類對象中執行excuteNextInstruction_Front_4函數;

實參格式: &PLC_service::robot_pick_up_2_to_tray

//傳入PLC_service類中的函數體 實參格式:&PLC_service::robot_pick_up_3_to_tray
 excuteNextInstruction_Front_4(
                &PLC_service::robot_pick_up_2_to_tray
                ,&PLC_service::robot_pick_up_10_to_tray
                ,&PLC_service::robot_pick_up_18_to_tray
                ,&PLC_service::robot_pick_up_26_to_tray);
           

繼續閱讀