看板 C_and_CPP 關於我們 聯絡資訊
在 virtual dtor 釋放資源的設計是對的。(這不是基本中的基本嗎?) 這跟他是不是要用 template method pattern 無關。 T 取得的資源就在由 T 來釋放。 他在其他要呼叫 template method 的地方都可以盡情的呼叫沒關係, 但是本質上資源管理是正交的一件事, 「要放掉 T 取得的資源的時候,事情就是在 T 的 dtor 作」 乖乖的把東西在 T::~T() 用 T::doClose() 放掉就對了。 繼承的深度並不是問題, D1::~D1() { D1::doClose() ; } D2::~D2() { D2::doClose() ; } D3::~D3() { D3::doClose() ; } 串一百層也一樣,資源管理這回事就是「每個人管好自己」就對了。 這個觀念不管在哪邊都是一樣, 老實說我一開始就不明白這個問題為什麼是個問題 -_-a 原 po 不要被什麼 template method pattern 迷惑了雙眼阿, 事情很簡單,就是乖乖在 dtor 把資源放掉就對了。 偷懶的話就是把要管的資源用 share_ptr 包住。 這樣什麼都不用管。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.160.254.105
legnaleurc:如何被釋放和何時被釋放是兩回事 ... 10/08 12:27
legnaleurc:而且上一篇也有人回應了,如果繼承不只一層 10/08 12:29
legnaleurc:呼叫 virtual function 還是可能會出問題 10/08 12:29
littleshan:多層繼承為什麼會出問題? 10/08 13:55
cplusplus:大家都有看清楚嗎 @@...? 10/08 19:31
cplusplus:我覺得原PO的問題不是真的"只要"釋放資源 不然就像我上 10/08 19:32
cplusplus:一篇講的一樣,也就是你這篇講的(為何要重複說?) 10/08 19:33
cplusplus:話說原PO你要不要放棄太貼心的設計 XD ? 10/08 19:35
cplusplus:如果沒要在釋放時做些特別的動作,照YOCO講的就好了呀 10/08 19:43
legnaleurc:ya...我猜這是個取捨吧。我原本的做法就是把責任推給 10/08 21:35
legnaleurc:client,只是想知道有沒有更有趣或更髒的方法 10/08 21:36
legnaleurc:看來不要做太多會活比較久一點 10/08 21:37
yoco315:你看仔細,我根本沒透過虛擬函數釋放資源.. 10/08 21:45
yoco315:物件結束時,釋放資源的動作都在取得資源的類別 10/08 21:45
yoco315:的解構子自己來釋放,根本沒有問題.. 10/08 21:46
yoco315:你要 base->close() 就盡情的 base->close() 沒問題 10/08 21:46
yoco315:但是 ~base() 的時候不要呼叫 close() 就好了.. 10/08 21:46
yoco315:如果執意要實行 template method pattern.. 10/08 21:48
yoco315:反而是奇怪的事情,DP 是要用在適合的地方 10/08 21:48
yoco315:不管合不合用硬要用就 over DP... 沒意義... 10/08 21:49
saxontai:其實我認為legnaleurc的貼心,最大的好處是保護自己的程 10/08 22:44
saxontai:式不被設計不良的plug-in影響,這是win-win。XD 10/08 22:45
cplusplus:YOCO 我之前的文章就也有提到 也是沒用虛擬機制 :) 10/08 23:06
cplusplus:比較有sense的人都知道該那樣做,大家只是針對原PO的 10/08 23:07
cplusplus:CASE討論罷了 :) 10/08 23:07