[問題] 動態載入一組函式

看板C_and_CPP作者 (好人超)時間14年前 (2012/02/24 23:46), 編輯推噓5(509)
留言14則, 3人參與, 最新討論串1/3 (看更多)
假如我有這樣的一組介面: class Calc { public: virtual int add(int x, int y) = 0; virtual int sub(int x, int y) = 0; virtual int mul(int x, int y) = 0; virtual int div(int x, int y) = 0; }; 我想問的是,有沒有辦法做到類似這樣的東西? int main() { Calc *calc = NULL; HANDLE hLibrary = Dynamic_Load("FastCalc.dll"); calc = GetInterface(hLibrary); calc->add(....); calc->sub(....); calc->mul(....); calc->div(....); return 0; } 也就是說,我有一個 pure virtual class 來描述介面 另外有個 FastCalc.dll 裡面實作了這個介面 (當然不管它是怎麼實作的) 我想像上例這樣很簡單的載入整組介面來使用它 稍微研究過COM,不過還不是很熟,不知道它能不能做到這樣 如果可以的話請給我一些關鍵字或範例,COM對我來說實在不容易理解orz 另外我也很好奇,在Linux環境有沒有辦法解決這個問題? 話說,這個時候真的會很羨慕C#/Java的Reflection機制 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 101.13.50.119 ※ 編輯: james732 來自: 101.13.50.119 (02/24 23:49)

02/25 00:14, , 1F
為什麼不用 GetProcAddress(..., add); 就好呢
02/25 00:14, 1F
因為它一次只能取得一個Function 我希望能夠有辦法一口氣取得一組Function 最好還能像我的例子,用物件的方式來操作它 用起來就像一個普通的object pointer ※ 編輯: james732 來自: 101.13.50.119 (02/25 00:26)

02/25 14:46, , 2F
J大問下,單獨想取得calc::add Getpro..(要怎寫呢)
02/25 14:46, 2F

02/25 14:49, , 3F
就算拿到funcion address..沒拿到instance該怎呼叫呢
02/25 14:49, 3F

02/25 14:52, , 4F
因為我也是看到都export 一個creator, 動態的話 ,class 是唯
02/25 14:52, 4F

02/25 14:53, , 5F
一解嗎
02/25 14:53, 5F

02/25 15:01, , 6F
你拿不到 Calc::add 的位址,因為它是 virtual ← 重點
02/25 15:01, 6F

02/25 15:02, , 7F
回想一下呼叫 virtual function 的方法
02/25 15:02, 7F

02/25 15:03, , 8F
從instance取得vtable → 從vtable取得function addr
02/25 15:03, 8F

02/25 15:03, , 9F
所以沒有instance你就不可能拿到Calc::add的位址
02/25 15:03, 9F

02/25 15:04, , 10F
回過頭來,「取得Calc::add的位址」這個想法就有問題
02/25 15:04, 10F

02/25 15:05, , 11F
OOP的多型就是為了讓你省下自己去拿函式位址的功夫
02/25 15:05, 11F

02/25 15:06, , 12F
所以把virtual function的位址封裝在vtable裡面
02/25 15:06, 12F

02/25 15:06, , 13F
為什麼你還要反其道而行呢
02/25 15:06, 13F

02/25 20:58, , 14F
那若是非virtual的function 該怎麼寫呢@@
02/25 20:58, 14F
文章代碼(AID): #1FHx3LsB (C_and_CPP)
文章代碼(AID): #1FHx3LsB (C_and_CPP)