Re: [問題] 求助 class 內的function pointer用法
看板C_and_CPP (C/C++)作者LPH66 ((short)(-15074))時間16年前 (2009/09/03 03:14)推噓1(1推 0噓 6→)留言7則, 2人參與討論串5/6 (看更多)
※ 引述《kkroy (大豬小豬肉一斤)》之銘言:
: 很感謝QQ29為我解答,不過有些細節我還是沒有搞懂,希望大家指點指點。
: : #include <iostream>
: : using namespace std;
: : class A;
: : typedef void(A::*PTR)(int,int);
: 其實這一行我就沒有看很懂,後來爬了文發現QQ大先前也有一樣的問題,
: typedef int b 的用法 一直以為 可以用 b 來宣告int型態的變數,僅此而已。
: 後來才知道有 typedef void (*A)(int,int); 的用法,
: 亦即 以A 來做為 宣告 void(*)(int,int) 型態(function pointer)的變數,
: 這樣理解應該沒錯吧?
: 至於先宣告class A 也很好理解,因為A在此時尚未定義,
: 需要qualify PTR 為其member function。
: 但是A::* 我就不懂了,A::*PTR的意思是什麼呢?
: 為什麼我加上A::(*PTR) compiler 不會過?
一樣的理由
只是這裡是宣告成 void (A::*)(int,int) 這樣的 member function pointer
表示這個 function pointer 是指向某個 class A 的 member function
其收兩個整數當參數 無回傳值
或者這樣看:
void (A::*PTR)(int,int)
PTR PTR is a ...
)
* ... pointer points to ...
A:: ... a member of A ...
(
(int,int) ... that is a function having ... as arguments ...
void ... and returning void
: : class A
: : {
: : public:
: : A(){}
: : void QQ(int a,int b){cout<<a<<b;}
: : void XD( PTR P){ (this->*P)(5,6);}
: ↑ 我也不知道為什麼要加上*
18058 (#1AdeckEN) 的推文說得很清楚了
呼叫此種 member function pointer 所指向的 member function
需要使用 .* 或 ->* 此兩個運算子
(注意它們是一體的 也就是不能拆 雖然理解上可以分開看...)
於是這裡因為有的是自己的指標 this 因此取用 ->* 此一運算子
故 this->*P 即呼叫了自己這個物件中 P 所指向的 member function
: : void DO()
: : {
: : XD(&A::QQ);
: ↑這裡我也有問題,QQ已經是class A的成員函數
: 為何需要qualify呢?
不 qualify 的話誰知道你在說的是誰的 QQ.....
這和它是不是 A 的 member function 無關
: 那qualify後為何又要取址呢?
: 為什麼寫成 XD( &(A::QQ) ) Compiler也不會過?
告訴 compiler 你要的是 A::QQ 的位址 而非呼叫它
(C3867 的錯誤原因寫的很清楚了...)
至於 &(A::QQ) 為什麼不過...這我就不太清楚了
我猜如果括號起來的話 compiler 會以為你還是要呼叫它...
: : }
: : };
: : int main()
: : {
: : A T;
: : T.DO();
: : return 0;
: : }
: : 這樣是可以run的 是不是你想要的??
: : 有錯請各位多指教
: : ps.有誰知道我寫this->這個 為啥不寫會錯= = 我想不透
: 很抱歉,我真的很新,
: 希望能為小弟解惑,感謝大家!
--
[LPH] Oops, your OOP's a problem? 說:
你現在還是看不到狗?
************* 說:
看得到 只是 他們不會跑 就一直呆呆在那邊 一直在起點
[LPH] Oops, your OOP's a problem? 說:
你要按"ㄅㄧㄤˋ"它們才會跑啊@@"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.84
推
09/03 03:20, , 1F
09/03 03:20, 1F
→
09/03 03:20, , 2F
09/03 03:20, 2F
→
09/03 03:22, , 3F
09/03 03:22, 3F
→
09/03 03:22, , 4F
09/03 03:22, 4F
→
09/03 03:25, , 5F
09/03 03:25, 5F
→
09/03 03:25, , 6F
09/03 03:25, 6F
→
09/03 08:40, , 7F
09/03 08:40, 7F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 6 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章