找回密码
 立即注册
收起左侧

C语言通过函数指针调用c++成员函数的方法

7
回复
8893
查看
[复制链接]
累计签到:20 天
连续签到:1 天
来源: 2015-10-13 18:25:40 显示全部楼层 |阅读模式
1Qter豆
最近为了练手,做了一个WAV的音频播放器,中间层用C语言实现并打包成 .a静态库(linux系统),ui层用qt实现。
现在遇到一个问题如下描述:
       qt 的窗体类中我定义了一个QSlider 的对象用于显示当前歌曲播放进度,但是不知道怎么把当前文件读写指针保存的当前播放位置传递给 窗体。
       在网上找到一中实现方法:先用c++函数调用c的函数将c++的一个函数名传递给c语言线程,c语言以函数指针的方式保存此函数名,在播放时通过函数指针调用c++的函数,并将当前播放进度通过参数传递给c++完成显示。
       但是可惜只找到了c语言的部分代码,不知道在c++中该怎么写,下边是部分c代码
  1. static void (*setState)(PLAYSTATE state,int val);  //函数指针变量 存UI层函数指针

  2. //设置状态信息句柄 通过该设置,将调用方需要处理状态的函数地址传入本地,如设为NULL则不需处理
  3. int minit(void (*handler)(PLAYSTATE state,int val) ){
  4.     setState=handler;
  5.     return 0;
  6. }
复制代码
特请教各位前辈大神。望指教。

最佳答案

查看完整内容

你要调用c++成员函数,必须要传递 this指针,你不用内嵌汇编的话,需要把c++成员函数 例如 void C1::f1()的声明改为 cdecl:void __cdecl f1(),然后你c语言调用的时候,还需要传递this指针(例如 C1*pObj=0; f1(pObj))
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2015-10-13 18:25:41 显示全部楼层
你要调用c++成员函数,必须要传递 this指针,你不用内嵌汇编的话,需要把c++成员函数  例如  void  C1::f1()的声明改为 cdecl:void  __cdecl f1(),然后你c语言调用的时候,还需要传递this指针(例如  C1*pObj=0;  f1(pObj))
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2015-10-16 16:24:29 显示全部楼层
很简单,你那个函数指针声明有错,应该是这样: static void (*setState)(QSlider* pObj,PLAYSTATE state,int val);
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2015-10-16 16:26:01 显示全部楼层
应该是这样: static void (__stdcall*setState)(QSlider* pObj,PLAYSTATE state,int val);开始少了个__stdcall 是要不得的
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2015-10-16 16:35:44 显示全部楼层
再改一下,static void (__stdcall*setState)(PLAYSTATE state,int val);然后你在调用的时候,需要用内嵌汇编,例如 vc中
QSlider* pObj=XXXXXXX;
__asm mov ecx,pObj
setState(state,val)
回复

使用道具 举报

累计签到:20 天
连续签到:1 天
2015-10-17 12:52:22 显示全部楼层
whsx2013001 发表于 2015-10-16 16:35
再改一下,static void (__stdcall*setState)(PLAYSTATE state,int val);然后你在调用的时候,需要用内嵌汇 ...

还需要内嵌汇编?   我想知道 c语言怎么才能修改 c++的类成员变量,用函数指针这种方法可以实现吗?
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2015-10-20 17:50:43 显示全部楼层
你可以加我qq  49676 9049  啊啊啊啊啊
回复

使用道具 举报

累计签到:20 天
连续签到:1 天
2015-10-20 21:10:15 显示全部楼层
终于解决了,最后在类中声明了一个友元函数和一个类自己的指针成员。让指针成员指向窗体类,然后在友元函数中通过全局类指针修改 窗体类中的成员。 虽然破环了类的封装性,但还是通过函数指针实现了c调用c++。多谢whsx2013001 的热心帮助,QQ已加,希望以后多交流。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了