[問題] 函數指標的使用問題

看板C_and_CPP (C/C++)作者 (123)時間16年前 (2010/04/09 18:08), 編輯推噓3(307)
留言10則, 2人參與, 最新討論串1/2 (看更多)
我有一個類別 類別裡有幾個函數 請問在類別中如何用函數指標來呼叫該類別中的函數 如: class A{ void run(){ cout<<"test"; } void start(){ void (*f)(); //函數指標 f=run; //指標指向目標函數(這裡報錯1.) f(); //使用函數指標執行函數 } }; 報錯1.argument of type `void (A::)()' does not match `void (*)()' 如果將run()改成static的話是可以的 但這樣run()使用上就不方便(如需要更改動態成員變數) 如何解決這個問題呢? --更新1-- 目前解決方法是在類別外寫一個函數用Class A的指標來呼叫A的run(): void wraper(){ A *a; a->run(); } 然後Class A 裡的f=run;改成f=wraper; 這樣就可以不改static也可以用該函數 問題就是 wraper()裡是重新宣告一個A的指標 所以執行的時候等於是重新執行一個新的A(變數都新的)而不是已經存在的A --更新2-- 暫時解決了 在wraper加入一個引數參數void* v 這個參數是要輸入一個類別指標 在這裡就是class A的指標 void wraper(void* v){ A *a=(A*)v; //宣告一個class A的指標並塞入v a->run(); //用指標呼叫函數 } 然後A裡面的start()改: void start(){ void (*f)(void*); //加入引數參數void* A *a; a=this; //將類別本身放入指標 f=wraper; f(a); //執行wraper(a); } 開發平台: (Dev-C++, Windows) 有更好的解決辦法嗎? 可以不用另外寫方法的 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.104.132

04/09 18:15, , 1F
試試看錯誤訊息講的那個吧...
04/09 18:15, 1F

04/09 18:15, , 2F
void (*f)(); 改成 void (*f)(A *); 呢?
04/09 18:15, 2F

04/09 18:15, , 3F
喔喔別理我 XD
04/09 18:15, 3F

04/09 18:15, , 4F
應該是void (A::*f)(); 吧
04/09 18:15, 4F
改成這樣後報錯是: 1.`void (A::)()' does not match `void (A::*)()' 2.must use .* or ->* to call pointer-to-member function in `f (...)' 恩...有點接近卻不知道怎麼改才對

04/09 18:30, , 5F
04/09 18:30, 5F

04/09 18:51, , 6F
void (A::*f)() = &A::run; //這樣呢?
04/09 18:51, 6F
改成這樣後可以塞入 但執行f()結果有報錯2. ※ 編輯: QgameQ 來自: 114.37.104.132 (04/09 21:48)

04/09 21:55, , 7F
因為不能直接用 他畢竟還是個nonstatic member func
04/09 21:55, 7F

04/09 21:55, , 8F
其實我覺得你設計得很怪 想要直接call
04/09 21:55, 8F

04/09 21:55, , 9F
又不寫成static...
04/09 21:55, 9F

04/09 22:01, , 10F
可是既沒參數, 又寫成static, 那是想動誰的變數?
04/09 22:01, 10F
文章代碼(AID): #1Bllopg3 (C_and_CPP)
文章代碼(AID): #1Bllopg3 (C_and_CPP)