把全局函数指针指向类的成员函数
2016-08-12 17:40
260 查看
转载请注明来源:http://blog.csdn.net/caoshiying
博客搬家:http://www.cnblogs.com/xuesongshu/p/3877060.html
我以前经常考虑使用WNDCLASS、CreateThread之类的Windows API时如何在类里面调用,传入函数参数地址时如何使用成员函数的地址。为了研究,写了一个研究程序,代码如下:
调试的时候发现在调用类的成员之前堆栈里的this指针是空的,输入之后输出结果的值前者是随机的,后者直接访问出错(空引用)。
对于成员函数与成员变量而言,同一类型的不同对象的同一成员变量的偏移地址是相同的,访问成员变量时它们的地址是基于对象的地址叠加计算的,如果用上述方法进入成员函数进而方问成员变量,那么访问出错。就算在访问成员变量之前把对象指针压入堆栈,不仅要考虑压入哪个对象的地址,而且这样使用成员函数实际上把它当成了全局函数来用,与静态成员函数使用在使用目的上没有区别,失去了面象对象的意义。
博客搬家: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指针是空的,输入之后输出结果的值前者是随机的,后者直接访问出错(空引用)。
对于成员函数与成员变量而言,同一类型的不同对象的同一成员变量的偏移地址是相同的,访问成员变量时它们的地址是基于对象的地址叠加计算的,如果用上述方法进入成员函数进而方问成员变量,那么访问出错。就算在访问成员变量之前把对象指针压入堆栈,不仅要考虑压入哪个对象的地址,而且这样使用成员函数实际上把它当成了全局函数来用,与静态成员函数使用在使用目的上没有区别,失去了面象对象的意义。
相关文章推荐
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- 指向类成员函数的指针并非指针
- 指向成员函数的指针
- C++指向类成员函数的指针
- C++里,在类中使用指向类成员函数的指针
- 定义指向类成员函数和类静态成员函数的指针
- 指向成员函数的指针
- 指向成员函数的指针
- 指向类非static的数据成员和函数的指针用法
- 函数指针传递的两种环境(全局函数与类成员函数)
- 指向 类成员函数 的 函数指针
- Item 16. 指向成员函数的指针
- Item 16. 指向成员函数的指针
- 指向类的数据成员和函数指针
- 指向成员函数的指针类型成员变量
- Pointers to Class Members Are Not Pointers(指向类成员函数的“指针”并非指针)
- Item 16. 指向成员函数的指针
- 函数指针 指向 类成员!
- C++中关于指向对象成员函数打指针例子
- c++ 指向 类成员函数(thiscall)的 函数指针