[問題] 請問怎麼將類別打包成 dll 給客戶

看板C_and_CPP (C/C++)作者 (麵T)時間9年前 (2017/01/11 11:27), 9年前編輯推噓5(5022)
留言27則, 10人參與, 最新討論串1/2 (看更多)
公司的一位前輩說要打包類別, 要考慮隱藏 data member 。 只能在 . h 檔中透漏 member function. 所以給客戶(PM)的必須為抽象類別, 繼承的類別寫在cpp檔中再去實作。 此外,提供一個 new function 給客戶 如: class Abstract { public: Abstract *DoSomething() const; }; Abstract *NewAbstract(…); 這樣一來,客戶就不知道 data member 比較無法猜出實作細節。 但指標管理會是個問題, 例如上面的 DoSomething 返回指標。 請問大家打包程式碼時, 有什麼技巧呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.28.18.121 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1484105235.A.6BF.html

01/11 11:57, , 1F
不就pimpl嗎
01/11 11:57, 1F

01/11 13:44, , 2F
推1樓
01/11 13:44, 2F

01/11 15:41, , 3F
你老闆要給對方的是abstract class 介面是return ptr
01/11 15:41, 3F

01/11 15:41, , 4F
這不需要什麼特別打包或撰寫技巧吧
01/11 15:41, 4F

01/11 15:43, , 5F
編譯出來後是static或dynamic library 除非逆向工程
01/11 15:43, 5F

01/11 15:44, , 6F
否則無法知道實作細節
01/11 15:44, 6F

01/11 15:44, , 7F
指標管理部分 如果你被要求給裸指標就直接給
01/11 15:44, 7F

01/11 15:45, , 8F
需要管理的就用smart pointer
01/11 15:45, 8F

01/11 15:45, , 9F
在windows的話 之後只要給對方.h跟.lib 編譯就能過
01/11 15:45, 9F

01/11 15:46, , 10F
實際執行期間就像你講的 動態連結dll 執行環境沒有
01/11 15:46, 10F

01/11 15:46, , 11F
dll windows會自己警告
01/11 15:46, 11F

01/11 18:48, , 12F
目前是用 shared prt 做,覺得有些麻煩。
01/11 18:48, 12F

01/11 18:48, , 13F
這只是一個討論情境,並沒有真的客戶需求。
01/11 18:48, 13F

01/11 18:48, , 14F
我會再往一樓提的方向研究看看
01/11 18:48, 14F

01/11 20:33, , 15F
用 Pimpl 加幾個 macro 用起來很簡單, 也不會有你的問題
01/11 20:33, 15F

01/11 20:35, , 16F
最簡單每個物件用一個 unique_ptr 指向實作時就好, 除非
01/11 20:35, 16F

01/11 20:35, , 17F
想做 copy-on-write 才會比較麻煩, 但那就是另外的問題
01/11 20:35, 17F

01/11 21:16, , 18F
不能用 smart pointer 吧,客戶怎麼知道 NewAbstract 是如
01/11 21:16, 18F

01/11 21:17, , 19F
何以即使用哪個版本產生的?
01/11 21:17, 19F
客戶只要知道 Abstract 類別名就好了, 至於 NewAbstract 回傳哪一個子類別指標沒都關係, 只要用 Abstract* 都能接收吧? 或者是我誤會你的意思?

01/11 21:21, , 20F
pimpl或pure virtual interface
01/11 21:21, 20F
※ 編輯: noodleT (36.237.86.47), 01/11/2017 22:19:38 ※ 編輯: noodleT (36.237.86.47), 01/11/2017 22:20:42

01/11 22:53, , 21F
是可以接收,但清除就有麻煩,delete 不一定能工作吧
01/11 22:53, 21F

01/11 23:41, , 22F
絕對要有virtual dtor,否則delete base pointer是未定
01/11 23:41, 22F

01/11 23:41, , 23F
義行為。
01/11 23:41, 23F

01/12 18:50, , 24F
不用virtual dtor,而是需要成對的new/delete,因為dll的
01/12 18:50, 24F

01/12 18:50, , 25F
CRT和exe不一定相同 參考http://ideone.com/hHyGzP
01/12 18:50, 25F

01/14 12:53, , 26F
提供另一個方式 : Linker , #1IcjMQK3 (C_and_CPP)
01/14 12:53, 26F

01/14 12:55, , 27F
不是方式,是方向XD
01/14 12:55, 27F
文章代碼(AID): #1OTQOJQ_ (C_and_CPP)
文章代碼(AID): #1OTQOJQ_ (C_and_CPP)