将类的非静态成员函数作为函数指针传递

2023-11-02

项目场景:

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;
	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将类的非静态成员函数作为函数指针传递 的相关文章

随机推荐

  • vscode 中,vue导入组件路径提示

    VsCode中 Vue导入组件路径提示 当用Vue组件开发时 经常会引入文件 但又没提示该如何解决 注意 编写vue项目时需要从根目录打开 否则会导致很多插件不能用 注意 设置完成展示 打开VSCode 第一步 点击扩展 第二步 搜索框输入
  • 接口日志记录

    1 添加配置 保证日志记录信息类能执行
  • Bitcoin的Segwit地址

    Segwit地址又称隔离见证地址 在Bitcoin Blockchain上 经常可以看到类似bc1qmy63mjadtw8nhzl69ukdepwzsyvv4yex5qlmkd这样的以bc开头的地址 这种地址就是隔离见证地址 Segwit地
  • 汽车年检记录

    车子已经两年了 需要年检 早就听说年检挺麻烦的 要花不少时间 4S店也可以代为年检 不过第一次年检 我想自己体验一下 于是决定还是自己去年检 下面是年检的过程 备忘一下 另外我是去 浙江省杭州市市区浙江省杭州市西溪路529号 第一检测站进行
  • java并发编程(荣耀典藏版)

    大家好 我是月夜枫 聊一聊java中的并发编程 面试工作中也许都会用到 参考了很大博主的博客 整理了很久的文章 虽然还没有全部整理完 后续慢慢更新吧 并发编程 一 线程的基础概念 一 基础概念 1 1 进程与线程A 什么是进程 进程是指运行
  • 嵌入式LINUX环境搭建 - 写给刚入行的童学

    转自百问网论坛 www 100ask org 1 虚拟机里面的Linux无法上网 注意四个地方即可 第3点特别重要 很多同学的Linux不能上网就是因为这里 一定要选对网卡 千万别选自动 因为它还不够智能 如果你的物理机在用网线进行上网 那
  • C# 结构体(学习心得 16)

    结构体 是 值类型 数据结构 使单一变量可以存储各种数据类型的相关数据 struct 关键字用于创建结构体 结构体用来代表一个记录 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 一 定义结构体 声明方式 struct B
  • 新知同享

    谷歌致力于通过高效 可靠的方法 构建 AI 驱动的产品 如今已经走过了七年 AI 为先 的旅程 一起来看 2023 Google 开发者大会上 AI 开发如何被广泛应用 简化开发 并将机器学习的强大能力 引入到应用和工作流中 提高开发者工作
  • 离线安装docker,docker安装MySQL,Redis,ES,Kibana,mongoDB,RocketMQ

    目录 安装docker docker compose 离线安装docker docker compose 安装ElasticSearch 安装kibana 下载ik分词器 安装MySQL 设置MySQL主从 启动单机版MySQL可以不做这一
  • 搬砖时遇到的错误

    Unreachable code 我把下面两个写反了位置 下图是正确写法
  • Java中throw、throws和Throwable的联系与区别

    throw 意为 投掷 抛 扔 Throw Throws和Throwable三者都用于异常处理 1 Throwable Throwable在Java中是异常处理这个分支的顶级父类 其它所有异常处理的实现都依赖于Throwable 打开Jav
  • 进阶sql语句

    div class markdown views div
  • 【C语言】反序加密(非文件)

    算法集训传送门 引言 铭记于心 我唯一知道的 便是我一无所知 我们的算法之路 众所周知 作为一名合格的程序员 算法 能力 是不可获缺的 并且在算法学习的过程中我们总是能感受到算法的 魅力 短短几行代码 凝聚无数前人智慧 一个普通循环 即是解
  • 挂载nfs报错合集

    问题一 报错 VFS Unable to mount root fs via NFS trying floppy 83 929713 random fast init done 100 366640 VFS Unable to mount
  • LOL代练检测——2019腾讯游戏安全技术竞赛初赛记录

    因为想要去腾讯实习 所以参加了今年的腾讯游戏安全技术竞赛 这个比赛赢了会有一个实习的绿色通道 选了数据分析方向里面的机器学习 初赛题目很有趣 关于LOL 英雄联盟 的代练检测 Moba游戏常见的5v5模式 玩家将与其余9名玩家共同组成对局
  • python 群发邮件 亲测可用

    1 先开通邮件的POP3 SMTP IMAP 拿到授权密码 注意 不是邮箱密码 2 相关代码 里面涉及到的数据库和邮件 都是相对路径下的 可根据代码自行创建和维护 pip install PyEmail import smtplib smt
  • 瑞芯微RGMII的配置

    主要配置项 除去复位等信号 我们主要关注两大块的配置 时钟配置 MAC 采用125M时钟 PHY采用25M时钟 主要配置时钟源 这个和具体硬件连线强相关 例如125M时钟可以来源于soc内部的PLL 也可以由对端PHY 提供 由对端PHY
  • 暴力解法破解PTA L1-006 连续因子 (20分)

    L1 006 连续因子 20分 一个正整数 N 的因子中可能存在若干连续的数字 例如 630 可以分解为 3 5 6 7 其中 5 6 7 就是 3 个连续的数字 给定任一正整数 N 要求编写程序求出最长连续因子的个数 并输出最小的连续因子
  • JetBrains使用Edu邮箱免费注册

    参考 https blog csdn net qq 22070551 article details 88864870 主要需要注意的是下面的问题 有一种情况无法激活就是 提示 jetbrains account connection er
  • 将类的非静态成员函数作为函数指针传递

    项目场景 QT C C 混合编程 将类的成员函数作为函数指针传递 问题描述 无法将类的成员函数作为函数指针传递给C语言的结构体 协议由C语言开发 结构体如下所示 DLT645 环境结构体 typedef struct dlt645 uint