全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2557
推到 Plurk!
推到 Facebook!

如何使用類別函式指標?

答題得分者是:liangnet
firewing
一般會員


發表:23
回覆:47
積分:19
註冊:2002-12-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-21 15:19:45 IP:203.75.xxx.xxx 未訂閱
請問各位大大,我寫的哪裡有問題呢?為什麼 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-21 20:49:19 IP:219.84.xxx.xxx 未訂閱
你好: 找尋有關member function pointer的資料就有提到了。以下是c moderated討論區有關的FAQ http://www.parashift.com/c -faq-lite/pointers-to-members.html
firewing
一般會員


發表:23
回覆:47
積分:19
註冊:2002-12-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-21 21:16:06 IP:203.75.xxx.xxx 未訂閱
感謝大大的回覆,那篇文章我已經有看過了, 我也文章寫的,但文章中使用的不是 VCL 的 class 而我是在 TForm3 使用,照理說應該可以,但我 compiler 就是不能過, 請問我也寫錯嗎?? 謝謝~~
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-21 21:20:21 IP:220.140.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-21 22:21:28 IP:203.75.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-21 22:59:55 IP:220.140.xxx.xxx 未訂閱
引言: 感謝 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-22 00:14:29 IP:220.135.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-22 11:36:04 IP:61.225.xxx.xxx 未訂閱
引言: 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);
系統時間:2024-05-10 15:31:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!