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

看板C_and_CPP作者 (!)時間8年前發表 (2017/01/12 06:02), 8年前編輯推噓4(4036)
留言40則, 6人參與, 最新討論串2/2 (看更多)
這題我個人是覺得滿單純的 應該是沒有必要用到pimpl 寫了一份比較草率的代碼 有其他想法歡迎指教 基本類別AC http://codepad.org/ZZR2s2Mg 在這邊你看不到子類別的實作 甚至連Class宣告都看不到 繼承類別DC指標生成 http://codepad.org/3JIJmpbY 按照原PO老闆要求 寫在cpp裡面 用戶端呼叫 http://codepad.org/S7sj9wYz 原PO原本寫的doSomething那邊 將this指標回傳 我是有點搞不懂應用情境 畢竟取得instance的手段就已經可以透過NewAbstract生成 這個時候物件管理職責應該是到客戶端那邊 小弟拙見是用object pool來解決 讓class的static member function來做處理 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.45.154 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1484200970.A.3B7.html

01/12 14:28, , 1F
無法用object
01/12 14:28, 1F
敢問高見 我試了一下 確實會有些介面的問題(不該裸露的介面會暴露) 有沒有更好的解法? 2017/01/12 15:41更新 Pool、基本類別AC http://codepad.org/h8EcO50C Pool物件建立、繼承類別DC http://codepad.org/eUtUZEvZ 用戶端呼叫(Pool初始化、建立物件、Pool銷毀) http://codepad.org/RecSMm3b 有些地方寫得不是很嚴謹 大概一個概念 不知道各位前輩 有沒有什麼建議 分析 謝謝

01/12 14:40, , 2F
怎麼講的好像 Pimpl 是多難上手的高深技術 囧
01/12 14:40, 2F

01/12 14:42, , 3F
pimpl沒很難 只是在這個case沒必要
01/12 14:42, 3F

01/12 14:44, , 4F
對方的要求是要隱藏data member跟把繼承寫在cpp
01/12 14:44, 4F

01/12 14:44, , 5F
我覺得跟pimpl沒啥關係
01/12 14:44, 5F

01/12 14:45, , 6F
pimpl我會拿去處理其他問題 尤其是runtime時期的變化
01/12 14:45, 6F

01/12 14:46, , 7F
還有跟policy組合
01/12 14:46, 7F

01/12 14:46, , 8F
個人見解
01/12 14:46, 8F
※ 編輯: bachelorwhc (114.25.45.154), 01/12/2017 15:12:32 ※ 編輯: bachelorwhc (114.25.45.154), 01/12/2017 15:46:45

01/12 20:37, , 9F
CreateACPtr 跟 getThis 把 shared_ptr<> 跨 dll 傳遞
01/12 20:37, 9F

01/12 20:37, , 10F
不知是否可以?
01/12 20:37, 10F

01/12 21:51, , 11F
DoSomething 需要回傳的是一個新的類別,不是 this
01/12 21:51, 11F

01/12 21:54, , 12F
比如說有個向量A,B
01/12 21:54, 12F

01/12 21:54, , 13F
double L = A.cross(B). length();
01/12 21:54, 13F

01/12 21:54, , 14F
這時候 cross 回傳一個新指標,沒有人負責 delete
01/12 21:54, 14F

01/12 21:55, , 15F
got it 這樣就可以明白了
01/12 21:55, 15F

01/12 21:55, , 16F
這樣不是回傳this 而是新的指標 用smart pointer不是
01/12 21:55, 16F

01/12 21:55, , 17F
即可解決問題?
01/12 21:55, 17F

01/12 21:57, , 18F
但在 c++11 之前的解決辦法為?
01/12 21:57, 18F

01/12 21:59, , 19F
你那邊如果有auto_ptr 可以考慮用
01/12 21:59, 19F

01/12 21:59, , 20F
如果沒有的話 我會自己寫物件管理機制
01/12 21:59, 20F

01/12 22:00, , 21F
但有時物件小 其實我會考慮複製物件
01/12 22:00, 21F

01/12 22:00, , 22F
像你說的向量 我覺得到不用回傳指標
01/12 22:00, 22F

01/12 22:01, , 23F
實際上我是看生產物件的生命週期跟用途而定
01/12 22:01, 23F

01/12 22:01, , 24F
所以做法可能會差滿多的
01/12 22:01, 24F

01/12 22:08, , 25F
B 大前三個 code 是我目前做法
01/12 22:08, 25F

01/12 22:46, , 26F
覺得應該要像上篇推文用 rawptr + deleter 給 shared_ptr
01/12 22:46, 26F

01/12 22:47, , 27F
而非跨模組傳智能指標,這樣有版本問題及ABI不相容之類的
01/12 22:47, 27F

01/12 22:48, , 28F
介面包含stl不是不好嗎? stl版本不一致不就壞了?
01/12 22:48, 28F

01/13 01:59, , 29F
pimpl就是為了隱藏實作而來,只需要付出多一個指標的代
01/13 01:59, 29F

01/13 01:59, , 30F
價。直接生成物件,完全不需要管理生命周期。你目前的
01/13 01:59, 30F

01/13 01:59, , 31F
做法反而讓問題變得複雜,也不好用
01/13 01:59, 31F

01/13 02:36, , 32F
但他覺得這個簡單的方法沒必要啊 (完全搞不懂邏輯)
01/13 02:36, 32F

01/13 11:17, , 33F
@bluesoul 請問我前三份代碼跟pimpl差在哪? 我只用
01/13 11:17, 33F

01/13 11:18, , 34F
繼承多型就能夠處理這個問題
01/13 11:18, 34F

01/13 11:18, , 35F
我的疑問是原PO原文中的doSomething 我不知道他的意
01/13 11:18, 35F

01/13 11:18, , 36F
思 以為要回傳this 所以才提出用object pool解決生命
01/13 11:18, 36F

01/13 11:19, , 37F
期問題
01/13 11:19, 37F

01/13 11:20, , 38F
想請問 @bluesoul @uranusjr 我前三份代碼 哪裡沒隱
01/13 11:20, 38F

01/13 11:21, , 39F
藏實作? 我甚至不需要在父類別新增pimpl的data
01/13 11:21, 39F

01/13 11:21, , 40F
member
01/13 11:21, 40F
bachelorwhc: 原PO前輩要求"只能在 . h 檔中透漏 member function 01/13 11:26 bachelorwhc: 所以給客戶(PM)的必須為抽象類別" 想請問一下 你抽象 01/13 11:27 bachelorwhc: 類別有pimpl 沒辦法實例化 有什麼用? 01/13 11:27 bachelorwhc: 我是照著題目要求走啦 "只給抽象類別 無data member" 01/13 11:29 ※ 編輯: bachelorwhc (114.25.45.154), 01/13/2017 11:33:05
文章代碼(AID): #1OTnmAEt (C_and_CPP)
文章代碼(AID): #1OTnmAEt (C_and_CPP)