Re: [問題] 求助 class 內的function pointer用法

看板C_and_CPP (C/C++)作者 ((short)(-15074))時間16年前 (2009/09/03 03:14), 編輯推噓1(106)
留言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
請問 為啥會以為 有呼叫這個函意? &A::QQ看起來是A::QQ先做
09/03 03:20, 1F

09/03 03:20, , 2F
再取& 跟括號的涵義感覺一樣@@
09/03 03:20, 2F

09/03 03:22, , 3F
且A::QQ不就已經是位址了再對她取&是得到什麼阿....??
09/03 03:22, 3F

09/03 03:22, , 4F
總覺得我認知錯了
09/03 03:22, 4F

09/03 03:25, , 5F
不 qualify 的話誰知道你在說的是誰的 QQ...再請問 在那scope
09/03 03:25, 5F

09/03 03:25, , 6F
看到的不就是A::嘛 是規定說要寫A::還是怎麼理解~~謝謝
09/03 03:25, 6F

09/03 08:40, , 7F
後一個問題: 也許我在 global 也有一個QQ...
09/03 08:40, 7F
文章代碼(AID): #1AdiG4-1 (C_and_CPP)
文章代碼(AID): #1AdiG4-1 (C_and_CPP)