免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3183 | 回复: 7
打印 上一主题 下一主题

[C++] 奇怪的回调问题.... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-08 18:45 |只看该作者 |倒序浏览
      最近碰到个问题,需要从C里面回调C++的成员函数。倒是知道某种适配器模式或者static方法等很多方法,但是都会破坏封装……所以想试着用虚函数指针去实现回调,测试代码如下:
extern "C"
{
    typedef void (*F)(int);
}

class A
{
public:
    A()
    {
        F x= (F)*((int*)*(int*)this);
        x(3);
    }

    virtual void event(int x)
    {
        printf("--------%d---------\n", x);
    }
};

然后发现输出结果是8086不是3,很奇怪为什么参数传递不成功……跪求解释……

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
2 [报告]
发表于 2013-11-08 19:45 |只看该作者
回复 1# luciker1988


    成员函数有隐含的this指针啊,你的含数原型和成员函数的参数不匹配,由于这种不匹配你调用x(3)之后,x的值取决当时执行环境中stack上的内容是什么。而且你类型转换也有些问题吧。函数原型这么定义:typedef void (*F)(void*, int);类型转换这么用F x= (F)*(*((int***)this));调用时如下:x(NULL,3);这样就能达到你想到的结果了。



虚函数以及vtable的例子你可以参数这个贴子:http://bbs.chinaunix.net/thread-4085850-1-1.html

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2013-11-09 21:40 |只看该作者
楼主这个做法是什么意思...

论坛徽章:
0
4 [报告]
发表于 2013-11-11 09:39 |只看该作者
回复 2# myworkstation
非常感谢,虚函数指针理解不到位,虽然我还是不太清楚为什么前面会需要一个void*指针。


   

论坛徽章:
0
5 [报告]
发表于 2013-11-11 10:14 |只看该作者
回复 2# myworkstation
查了下资料……发现是编译器会隐含添加……如果说我的C库是封装好的……无法修改接口,那么只能通过static去实现回调了。。?


   

论坛徽章:
4
亥猪
日期:2013-09-27 13:50:29酉鸡
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥猪
日期:2013-10-26 11:50:59
6 [报告]
发表于 2013-11-12 16:43 |只看该作者
把this传过去??

论坛徽章:
0
7 [报告]
发表于 2013-11-13 09:49 |只看该作者
回复 6# AssassinPig
让C的回调函数指向C++的成员函数。
g++编译器(其它不知道)编译成员函数的时候会形成A(base *this, int );这样的格式,第一个base就是this指针,因此C语言指向的时候前面要加一个void *以匹配成员函数。


   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
8 [报告]
发表于 2013-11-13 16:16 |只看该作者
回复 5# luciker1988


    如果C库不能改的话只能用static函数方式了。否则潜在的问题太多(比如对象的方法不能访问对像成员,因为这依赖this指针,而this指针在调用时候传递不进来)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP