轉(zhuǎn)載請注明來源:http://www.cnblogs.com/xuesongshu/
我以前經(jīng)??紤]使用WNDCLASS、CreateThread之類的Windows API時(shí)如何在類里面調(diào)用,傳入函數(shù)參數(shù)地址時(shí)如何使用成員函數(shù)的地址。為了研究,寫了一個(gè)示例代碼:
成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為婁星等服務(wù)建站,婁星等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為婁星企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。#include
#include
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;
}調(diào)試的時(shí)候發(fā)現(xiàn)在調(diào)用類的成員之前堆棧里的this指針是空的,輸入之后輸出結(jié)果的值前者是隨機(jī)的,后者直接訪問出錯(cuò)(空引用)。
對于成員函數(shù)與成員變量而言,同一類型的不同對象的同一成員變量的偏移地址是相同的,訪問成員變量時(shí)它們的地址是基于對象的地址疊加計(jì)算的,如果用上述方法進(jìn)入成員函數(shù)進(jìn)而方問成員變量,那么訪問出錯(cuò)。就算在訪問成員變量之前把對象指針壓入堆棧,不僅要考慮壓入哪個(gè)對象的地址,而且這樣使用成員函數(shù)實(shí)際上把它當(dāng)成了全局函數(shù)來用,與靜態(tài)成員函數(shù)使用在使用目的上沒有區(qū)別,失去了面象對象的意義。
分享題目:我的一點(diǎn)關(guān)于把WndProc指向類的成員函數(shù)的看法-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/cdipic.html