首页 > 代码库 > 我的一点关于把WndProc指向类的成员函数的看法
我的一点关于把WndProc指向类的成员函数的看法
我以前经常考虑使用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指针是空的,输入之后输出结果的值前者是随机的,后者直接访问出错(空引用)。
对于成员函数与成员变量而言,同一类型的不同对象的同一成员变量的偏移地址是相同的,访问成员变量时它们的地址是基于对象的地址叠加计算的,如果用上述方法进入成员函数进而方问成员变量,那么访问出错。就算在访问成员变量之前把对象指针压入堆栈,不仅要考虑压入哪个对象的地址,而且这样使用成员函数实际上把它当成了全局函数来用,与静态成员函数使用在使用目的上没有区别,失去了面象对象的意义。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。