项目场景:
QT + C/C++混合编程 + 将类的成员函数作为函数指针传递
问题描述
无法将类的成员函数作为函数指针传递给C语言的结构体
协议由C语言开发,结构体如下所示:
//DLT645 环境结构体
typedef struct dlt645
{
uint8_t addr[6]; //从机地址
uint8_t debug; //调试标志
int (*write)(struct dlt645 *ctx, uint8_t *buf, uint16_t len); //底层写函数
int (*read) (struct dlt645 *ctx, uint8_t *msg, uint16_t len); //底层读函数
void *port_data; //移植层拓展接口
} dlt645_t;
函数在QT 窗口类中实现
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
int _645_write(dlt645_t *dlt645, uint8_t *buf, uint16_t len);
int _645_read(dlt645_t *dlt645, uint8_t *msg, uint16_t len);
}
想要在主函数main.cpp中将类的成员函数_645_write、_645_read作为函数指针赋给dlt645结构体
dlt645_t dlt645;
int main()
{
int (MainWindow::*pmf)(dlt645_t *dlt645, uint8_t *buf, uint16_t len);
MainWindow w;
pmf = &MainWindow::_645_write;
dlt645.write = (w.*pmf);
pmf = &MainWindow::_645_read;
dlt645.read = (w.*pmf);
}
报错:reference to non-static member function must be called;
原因分析:
已有分析,不再赘述:
C++中,将指向类的成员函数的指针作为参数传入普通函数,怎么才不会错? - 知乎用户的回答 - 知乎 https://www.zhihu.com/question/37130335/answer/70586240。
解决方案:
采用C++ 11中的std::function实现 “类的成员函数作为函数指针传递” 功能。
修改结构体定义为:
struct dlt645;
typedef std::function<int(struct dlt645*, uint8_t*, uint16_t)> Functional;
//DLT645 环境结构体
typedef struct dlt645
{
uint8_t addr[6]; //从机地址
uint8_t debug; //调试标志
Functional write; //底层写函数
Functional read; //底层读函数
void *port_data; //移植层拓展接口
} dlt645_t;
主函数中传递函数指针方式修改如下:
dlt645_t dlt645;
int main()
{
MainWindow w;
std::function<int(struct dlt645*, uint8_t*, uint16_t)> pm;
pm = std::bind(&MainWindow::_645_write, &w, std::placeholders::_1, std::placeholders::_2, std::placeholders::_2);
dlt645.write = pm;
pm = std::bind(&MainWindow::_645_read, &w, std::placeholders::_1, std::placeholders::_2, std::placeholders::_2);
dlt645.read = pm;
}