類成員函數的引用

場景

界面上,鈔票寬度以列表形式顯示,點擊曲線圖,彈出鈔票寬度的曲線圖。
曲線圖上,要求鼠標點在數據項時,可以顯示數據的信息,比如測試名稱,命令名稱,鈔票索引號,寬度值。
在循環測試下可以產生鈔票寬度數據,在單命令測試也可以產生鈔票寬度數據,在歷史數據查詢中,也會有寬度數據,這些寬度數據都會有一個寬度曲線圖。
在視線中,寬度曲線圖是一個類,循環測試,單命令測試,歷史數據查詢分別對應三個不同的類,如何從不同的類中獲取數據的提示信息呢?

解決方案

繼承機制

循環測試,單命令測試,歷史數據查詢三個類從一個數據源類中繼承過來,該數據源類定義一個獲取數據信息的虛函數,三個子類實現自己的函數。

QT信號槽

以Q表示曲線圖類,以D表示循環測試/單命令測試/歷史數據查詢類,交互過程如下
1)Q 發出 GET_DATA_INFO 信號
2)D 響應 Q::GET_DATA_INFO 信號,整理好數據信息, 發出 DATA_INFO_DONE 信號
3)Q 響應 D::DATA_INFO_DONE信號,保存數據信息到本地;
4)Q 讀取本地保存的數據信息並顯示
此方案使用了在UI主界面中信號槽是按順序執行的。但是,處理流程過於冗長;

C++11 bind

std::bind可以綁定任意類的某一類型函數。可以參照下面示例理解

#include <iostream>    
#include <functional>    
using namespace std;    

typedef std::function<std::string (int)> fpi;    
class View
{
public:
    View(){}
    void show(int idx){
        std::cout<<m_func(idx)<<"\n"; 
    }
    void setFunc(fpi func)
    {
        m_func = func;
    }

protected:
    fpi m_func;
};
class Data{
public:
    Data(){}

    string getDesc(int idx)
    {
        return std::to_string(idx);
    }
};

void test2()
{
    View view;
    Data data;
    fpi fpGetDesc = std::bind(&Data::getDesc, &data, std::placeholders::_1);
    view.setFunc(fpGetDesc);
    view.show(0);
    view.show(4444);
}

 int main()    
 {   
    test2();

     return 0;    
 }

結果如下

g++ -o test bindtest.cpp
$ ./test.exe
0
4444

這種方法更爲靈活。

引用

https://blog.csdn.net/tieshuxianrezhang/article/details/80635508

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章