• 我的一点关于把WndProc指向类的成员函数的看法


    转载请注明来源:http://www.cnblogs.com/xuesongshu/

      我以前经常考虑使用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("
    say:%d%d
    ",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指针是空的,输入之后输出结果的值前者是随机的,后者直接访问出错(空引用)。

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

  • 相关阅读:
    4.1.7 POD对象
    异常处理
    POJ3167 Cow Patterns [KMP]
    POJ1961 Period [KMP应用]
    POJ2778 DNA Sequence [AC自动机+矩阵]
    HDU2243 考研路茫茫——单词情结 [AC自动机+矩阵]
    POJ2185 Milking Grid [KMP应用]
    POJ2541 Binary Witch [状态压缩]
    ZOJ3430 Detect the Virus [AC自动机]
    POJ2752 Seek the Name, Seek the Fame [KMP]
  • 原文地址:https://www.cnblogs.com/xuesongshu/p/3877060.html
Copyright © 2020-2023  润新知