类成员函数的引用

场景

界面上,钞票宽度以列表形式显示,点击曲线图,弹出钞票宽度的曲线图。
曲线图上,要求鼠标点在数据项时,可以显示数据的信息,比如测试名称,命令名称,钞票索引号,宽度值。
在循环测试下可以产生钞票宽度数据,在单命令测试也可以产生钞票宽度数据,在历史数据查询中,也会有宽度数据,这些宽度数据都会有一个宽度曲线图。
在视线中,宽度曲线图是一个类,循环测试,单命令测试,历史数据查询分别对应三个不同的类,如何从不同的类中获取数据的提示信息呢?

解决方案

继承机制

循环测试,单命令测试,历史数据查询三个类从一个数据源类中继承过来,该数据源类定义一个获取数据信息的虚函数,三个子类实现自己的函数。

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

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