把全局函数指针指向类的成员函数

转载请注明来源:http://blog.youkuaiyun.com/caoshiying

博客搬家:http://www.cnblogs.com/xuesongshu/p/3877060.html

我以前经常考虑使用WNDCLASS、CreateThread之类的Windows API时如何在类里面调用,传入函数参数地址时如何使用成员函数的地址。为了研究,写了一个研究程序,代码如下:

#include <iostream>
#include <stdio.h>
 
using namespace std;
 
typedef int (__stdcall *XSSH_SAY_HELLO)(int);
 
class XTestMethod
{
    typedef int (__stdcall XTestMethod::*XSayHello)(int);
public:
    XSayHello say;
    int hi;
public:
    XTestMethod();
    virtual ~XTestMethod();
    int sayhello(int arg);
};
 
XTestMethod::XTestMethod()
{
    say=&XTestMethod::sayhello;
    hi=1000;
}
 
XTestMethod::~XTestMethod()
{
     
}
 
int XTestMethod::sayhello(int arg)
{
    printf("\r\nsay:%d%d\r\n",arg,this->hi);
}
 
int main(int argc, char *argv[])
{
    XTestMethod t;
    XSSH_SAY_HELLO call=*(XSSH_SAY_HELLO*)&t.say;
    call(0);
    system("pause");
    return 0;
}

调试的时候发现在调用类的成员之前堆栈里的this指针是空的,输入之后输出结果的值前者是随机的,后者直接访问出错(空引用)。


对于成员函数与成员变量而言,同一类型的不同对象的同一成员变量的偏移地址是相同的,访问成员变量时它们的地址是基于对象的地址叠加计算的,如果用上述方法进入成员函数进而方问成员变量,那么访问出错。就算在访问成员变量之前把对象指针压入堆栈,不仅要考虑压入哪个对象的地址,而且这样使用成员函数实际上把它当成了全局函数来用,与静态成员函数使用在使用目的上没有区别,失去了面象对象的意义。

转载于:https://my.oschina.net/zhtqs/blog/1509827

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值