如何取得函式位址? |
答題得分者是:pwipwi
|
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
請問要如何取得Class的函式位址?
Class定義如下: class A : public TForm { public: __fastcall A(TComponent *AOwner); bool __fastcall CheckValue(int Value); }; 取得函式位址 __fastcall A::A(TComponent *AOwner):TForm(AOwner) { int Address = (int)CheckValue; <===編譯不會過? ShowMessage(IntToHex(Address,8)); } 但是如果我將CheckValue這個函式不放在Class,改成如下: class A : public TForm { public: __fastcall A(TComponent *AOwner); }; bool __fastcall CheckValue(int Value); 這樣就可以順利編譯成功! 我要如何才能取得Class裡面函式的位址?因為我要將此位址傳給另一個類別來呼叫此函式! |
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請問要如何取得Class的函式位址?liangnet 你好: 先試試這樣子寫可不可以呢? < class="code"> ShowMessage(IntToHex((int)MethodAddress("CheckValue"), 8)); -- Enjoy Researching & Developing --Class定義如下: class A : public TForm { public: __fastcall A(TComponent *AOwner); bool __fastcall CheckValue(int Value); }; 取得函式位址 __fastcall A::A(TComponent *AOwner):TForm(AOwner) { int Address = (int)CheckValue; <===編譯不會過? ShowMessage(IntToHex(Address,8)); } 但是如果我將CheckValue這個函式不放在Class,改成如下: class A : public TForm { public: __fastcall A(TComponent *AOwner); }; bool __fastcall CheckValue(int Value); 這樣就可以順利編譯成功! 我要如何才能取得Class裡面函式的位址?因為我要將此位址傳給另一個類別來呼叫此函式!
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
liangnet你好:
如果你是要處理Cplusplus class成員函數位置,個人建議不要傳給"不同型別的"class來呼叫。如果是同一種類的class,倒是可以。例子如下:
class MyClass{ public: void F1(int){} void F2(float){} }; void __fastcall TForm1::Button1Click(TObject *Sender) { void (MyClass::*AddressOfF1)(int) = MyClass::F1; void (MyClass::*AddressOfF2)(float) = MyClass::F2; MyClass object; ((object).*(AddressOfF1))(1); ((object).*(AddressOfF2))(1.2); }至於為何不同型別的class我不建議....這大概需要寫一篇文章來解釋了。也是可以做到的,只是你用的時候別說是我告訴你的。例子如下: < class="code"> class Foo { public: int Value; Foo(int Value_):Value(Value_){} int Bar(void) {return Value;} }; void main() { int (Foo::*pBar)(void) = &Foo::Bar; long address = *(long*)&pBar; int (*ptr)(Foo*) = *(int(*)(Foo*))address; Foo a(10),b(200); cout << (*ptr)(&a) << endl; // 10 cout << (*ptr)(&b) << endl; // 200 } 不過以上的方法有很多不適用的地方。比如在VCL用法完全不同,borland為了做到這個功能,還引進了__closure關鍵字。如果你是要在VCL中用像是event handler的功能,可以考慮用__closure就可以解決。用法如下: void __fastcall TForm1::Button1Click(TObject *Sender) { void __fastcall (__closure *AddressOfOnClick)(System::TObject* Sender) = Button1->OnClick; AddressOfOnClick(Button2); }不過,還是有使用上要注意的地方,例如用closure呼叫時,和Cplusplus的member function是完全不同的,this指標不一定是指向正確的object。所以要用到成員變數,就要利用Sender指標(Sender指標就是要代替this用的)。其他的使用細節,如果有遇到問題再一起討論吧 |
liangnet
中階會員 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |