如何使用類別函式指標? |
答題得分者是:liangnet
|
firewing
一般會員 ![]() ![]() 發表:23 回覆:47 積分:19 註冊:2002-12-13 發送簡訊給我 |
請問各位大大,我寫的哪裡有問題呢?為什麼 compiler 會出現
"Illegal use of member pointer" .h
class TForm3 : public TForm { __published: void __fastcall RadioGroup1Click(TObject *Sender); public: void __fastcall RdBtn1Click(TObject *Sender); void __fastcall RdBtn2Click(TObject *Sender); void __fastcall RdBtn3Click(TObject *Sender); ... ... ... }; extern PACKAGE TForm3 *Form3; typedef void __fastcall(TForm3::*RdBtnClick)(TObject *Sender);.cpp RdBtnClick SelRdBtn[3]={&TForm3::RdBtn1Click, &TForm3::RdBtn2Click, &TForm3::RdBtn3Click }; void __fastcall TForm3::RadioGroup1Click(TObject *Sender) { RdBtn1Click(Sender); // ==> 可以執行 (*SelRdBtn[0])(Sender); // 會出現 "Illegal use of member pointer" } void __fastcall TForm3::RdBtn1Click(TObject *Sender) { ... ... ... } void __fastcall TForm3::RdBtn2Click(TObject *Sender) { ... ... ... } void __fastcall TForm3::RdBtn3Click(TObject *Sender) { ... ... ... }謝謝各位大大 |
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
firewing
一般會員 ![]() ![]() 發表:23 回覆:47 積分:19 註冊:2002-12-13 發送簡訊給我 |
|
liangnet
中階會員 ![]() ![]() ![]() 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
typedef void __fastcall(__closure *RdBtnClick)(TObject *Sender); RdBtnClick SelRdBtn[4]; __fastcall TForm3::TForm1(TComponent* Owner)
: TForm(Owner)
{
SelRdBtn[0] = RdBtn1Click;
SelRdBtn[1] = RdBtn1Click;
SelRdBtn[2] = RdBtn1Click;
SelRdBtn[3] = RdBtn1Click; /Call
SelRdBtn[0](this);
SelRdBtn[1](this);
SelRdBtn[2](this);
} 呵不好意思,太久沒碰BCB了,不知道這樣的例子是否你的需求?
|
firewing
一般會員 ![]() ![]() 發表:23 回覆:47 積分:19 註冊:2002-12-13 發送簡訊給我 |
感謝 liangnet 大大 問題解決了,
可以跟我說為啥麼要這樣寫嗎?? 文章中的寫法有錯嗎?? 另外我是不是不可以用 RdBtnClick SelRdBtn[3]={&TForm3::RdBtn1Click,
&TForm3::RdBtn2Click,
&TForm3::RdBtn3Click
};
一定要在建構函式中: SelRdBtn[0] = RdBtn1Click;
SelRdBtn[1] = RdBtn2Click;
SelRdBtn[2] = RdBtn3Click;
SelRdBtn[3] = RdBtn4Click; 還有呼叫時為什麼要傳 this 呢?? 名名宣告為 TObject * 感謝大大給我的協助
|
liangnet
中階會員 ![]() ![]() ![]() 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
引言: 感謝 liangnet 大大 問題解決了, 可以跟我說為啥麼要這樣寫嗎?? 文章中的寫法有錯嗎?? 另外我是不是不可以用 RdBtnClick SelRdBtn[3]={&TForm3::RdBtn1Click, &TForm3::RdBtn2Click, &TForm3::RdBtn3Click }; 一定要在建構函式中: SelRdBtn[0] = RdBtn1Click; SelRdBtn[1] = RdBtn2Click; SelRdBtn[2] = RdBtn3Click; SelRdBtn[3] = RdBtn4Click; 還有呼叫時為什麼要傳 this 呢?? 名名宣告為 TObject * 感謝大大給我的協助我的方法只能在BCB裡用的,因為__closure 是BCB擴充出來的關鍵字! 這是BCB裡對__closure的描述。 The keyword __closure was added to support the VCL and is used when declaring event handler functions. For more information, 你的方法~應該是這樣寫 RdBtnClick SelRdBtn[3]={&TForm3::RdBtn1Click, &TForm3::RdBtn2Click, &TForm3::RdBtn3Click }; 要Call時: TForm3 *f; TForm3 *a = new TForm3(); (f->*SelRdBtn[0])(a); 但是你這樣呼叫該函式時,你會無法存取TForm3類別的資料(不能使用this指標來存取類別本身的成員)。因為f未配置實體的物件。但是可以透過傳入a來存取TForm3類別裡的成員。 TForm3 *f = new TForm3(); // <==配置一個實體的物件 (f->*SelRdBtn[0])(f); // 這樣的寫法,就可以在該函式裡使用this指標來存取TForm3類別裡的成員或使用f來存取。 |
firewing
一般會員 ![]() ![]() 發表:23 回覆:47 積分:19 註冊:2002-12-13 發送簡訊給我 |
liangnet 大大謝謝你的解釋,但 RdBtnClick SelRdBtn[3]={&TForm3::RdBtn1Click,
&TForm3::RdBtn2Click,
&TForm3::RdBtn3Click
}; 這樣寫 compiler 不會過, 因為 typedef void __fastcall(__closure *RdBtnClick)(TObject *Sender); 不能將 __closure 不能轉為 &TForm3::
錯誤訊息會顯示
[C Error] Unit3.cpp(13): E2034 Cannot convert 'void (_fastcall TForm3::*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'
|
liangnet
中階會員 ![]() ![]() ![]() 發表:19 回覆:148 積分:83 註冊:2004-01-03 發送簡訊給我 |
引言: liangnet 大大謝謝你的解釋,但 RdBtnClick SelRdBtn[3]={&TForm3::RdBtn1Click, &TForm3::RdBtn2Click, &TForm3::RdBtn3Click }; 這樣寫 compiler 不會過, 因為 typedef void __fastcall(__closure *RdBtnClick)(TObject *Sender); 不能將 __closure 不能轉為 &TForm3:: 錯誤訊息會顯示 [C Error] Unit3.cpp(13): E2034 Cannot convert 'void (_fastcall TForm3::*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'要改成這樣 typedef void __fastcall(TForm3::*RdBtnClick)(TObject *Sender); |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |