博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 成员函数赋值给C 的函数指针的采坑录---可删除
阅读量:6348 次
发布时间:2019-06-22

本文共 1007 字,大约阅读时间需要 3 分钟。

最近做一个banana Pi M1+的硬解码器封装成类的时候,由于是依赖ffmpeg的,而ffmpeg是C 实现的,本来demo 都是直接用C写的,测试也没有问题,想着封装也不会有问题,至少自己对C++类还是比较理解的(至少用于封装Android SDK还是很多次了)。

    就开始封装吧,我就直接把用到的全局变量和函数分别放到定义的类中,然后整理完后,直接编译,喔,报错!!然后查看错误,提示指针函数不符合,类型不对,类成员函数有个类,因为的确有行代码是把一个函数赋值给ffmpeg 结构体里面的函数指针(这也是ffmpeg的一种实现标准了),于是我就想着怎么赋值呢,怎么强制都不行,那就百度吧,果然有前辈,使用静态成员函数,“静态成员函数”:static 修饰,相当于在这个类作用域的全局函数,所以成员函数可以任意访问静态成员函数;于是在类中把要赋值给ffmpeg的函数定义成静态成员函数,编译报错!!因为刚刚定义的静态成员报错有个成员变量未定义,原来静态成员函数不能访问非静态成员变量,因为类的非静态成员都需要默认一个this指针才能访问的,想想也对,平时都是想new 一个对象 ,然后继续访问成员变量的。但是静态成员函数是全局的,定义时就有效,去访问一个无效的东西,的确会报错没有定义。

怎么解决呢?把静态成员函数访问的成员变量,定义成静态的。但是编译还是会报错,为什么呢?因为在类里面的静态变量在类里面只是声明,并没有初始化定义,所以再在类外面初始化类的静态成员变量就好,终于解决了。

#include
using namespace std;typedef int(*p_fun)();class Test {public : static int fun() { a = 9; return 0; } int fun2() { a = 0; return 0; } int b; static int a;};int Test::a = 2;int main(){ Test obj; p_fun p; p = Test::fun; p(); cout << Test::a; obj.a = 19; cout << Test::a;}

 

转载地址:http://rovla.baihongyu.com/

你可能感兴趣的文章
Arm发布Cortex-A76AE自动驾驶芯片架构,宣示车载系统市场主权
查看>>
FreeBSD ports中make可带有的参数(转)
查看>>
Hibernate入门教程
查看>>
Java支付宝扫码支付[新]
查看>>
SpringMVC 拦截器 筛选
查看>>
CronExpression介绍
查看>>
第十八章:MVVM(八)
查看>>
点击表头切换升降序排序方式
查看>>
第26天,Django之include本质
查看>>
Java中静态变量和实例变量的区别
查看>>
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>
OTP 22.0 RC3 发布,Erlang 编写的应用服务器
查看>>