[問題] cpp的function pointer傳遞

看板C_and_CPP (C/C++)作者 (sigh)時間4年前 (2020/09/29 19:17), 4年前編輯推噓3(3025)
留言28則, 8人參與, 4年前最新討論串1/3 (看更多)
大家好 我有一個header, test.h, 有一個function pointer typedef int(*pfnTest_t)(void* x, unsigned char* y, unsigned int z); 一個API: int test_api(pfnTest_t p_pfnTest); 然後有一個cpp class B { ... test(); ... } B::B_API(void* x, unsigned char* y, unsigned int z){ ... } B::test() { test_api(&B::B_API); // error! } compiler的時候 有error 請問這cpp裡面如何把function pointer帶進去?? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 103.229.16.4 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1601378246.A.B9C.html

09/29 20:46, 4年前 , 1F
普通的function跟class裡的function是不同的東西
09/29 20:46, 1F

09/29 20:48, 4年前 , 2F
https://tinyurl.com/y37kytue 參考這篇的範例
09/29 20:48, 2F
謝謝 不過我的test_api()是另外一個lib (c code寫的) 目前prefer只改cpp的code去用test_api()

09/29 21:16, 4年前 , 3F
別傳遞函式指標,C++傳std::function比較靈活
09/29 21:16, 3F

09/29 21:20, 4年前 , 4F
果然有人推 std::function xD 看來是不知道它的用法
09/29 21:20, 4F
請問有範例嗎 謝謝

09/29 22:14, 4年前 , 5F
因為你的 function 不是 static?
09/29 22:14, 5F
改static似乎可 但B::test()裡面其實有用到一個member, m_var1他是Class B的public member, 似乎也要一致改 static? 但會有build error B::test() { test_api(&B::B_API); // error! m_var1->xxx }

09/29 22:21, 4年前 , 6F
你的test_api需要的參數是
09/29 22:21, 6F

09/29 22:21, 4年前 , 7F
int (*)(void*, unsigned char*, unsigned int);
09/29 22:21, 7F

09/29 22:21, 4年前 , 8F
你傳的是
09/29 22:21, 8F

09/29 22:22, 4年前 , 9F
int (B::*)(void*, unsigned char*, unsigned int);
09/29 22:22, 9F
本來下的參數 沒有B::B_API 但使用B_API在test_api裡面會有build error 查完似乎是要使用B::B_API, 但還是不懂該怎改才對orz ※ 編輯: sighAll (36.226.51.204 臺灣), 09/29/2020 23:02:35

09/29 23:02, 4年前 , 10F
謝謝大家回應
09/29 23:02, 10F

09/29 23:09, 4年前 , 11F
不然就再包一層了?
09/29 23:09, 11F

09/29 23:10, 4年前 , 12F
按照我的理解再包一層是要在c code那邊的lib對吧
09/29 23:10, 12F

09/30 00:35, 4年前 , 13F
還是不懂為什麼這麼寫,函式指標來當callback就是跟成
09/30 00:35, 13F

09/30 00:37, 4年前 , 14F
員函式搭不起來,如果是因為那個test_api是來自一個C語
09/30 00:37, 14F

09/30 00:38, 4年前 , 15F
言專案就只好迂迴的偷渡物件指標了,該專案就必須提供
09/30 00:38, 15F

09/30 00:39, 4年前 , 16F
填物件指標的介面
09/30 00:39, 16F

09/30 00:41, 4年前 , 17F
int *p = (*hello)(char * ){}
09/30 00:41, 17F

09/30 00:42, 4年前 , 18F
c++避免寫這種爛code來炫技
09/30 00:42, 18F

09/30 00:42, 4年前 , 19F
那樣的話介面可能是寫成test_api(pfn_t cb,void* p)
09/30 00:42, 19F

09/30 00:43, 4年前 , 20F
多給一個塞物件指標的參數
09/30 00:43, 20F

09/30 00:44, 4年前 , 21F
對大型專案毫無幫助
09/30 00:44, 21F

09/30 10:04, 4年前 , 22F
你 B 物件的個數和 test_api() 呼叫關係是怎麼樣?
09/30 10:04, 22F

09/30 12:33, 4年前 , 23F
考古一下: #1AdlQLYS (C_and_CPP)
09/30 12:33, 23F

09/30 21:26, 4年前 , 24F
你需要的是 partial application,這種好東西 cpp 也是
09/30 21:26, 24F

09/30 21:26, 4年前 , 25F
不會有的,不用擔心 XD
09/30 21:26, 25F

09/30 21:26, 4年前 , 26F
不過你可以把 pfnTest_t type 改成 int(*pfnTest_t)(B *t
09/30 21:26, 26F

09/30 21:26, 4年前 , 27F
hiz, void* x, unsigned char* y, unsigned
09/30 21:26, 27F

09/30 21:26, 4年前 , 28F
int z);
09/30 21:26, 28F
文章代碼(AID): #1VSnV6kS (C_and_CPP)
文章代碼(AID): #1VSnV6kS (C_and_CPP)