看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 沒有 C++11 的編譯器 問題(Question): 最近遇到一個設計的問題, 想請問一下有沒有什麼比較好的解決方法 我不太會描述(如果標題不好也麻煩提示一下要怎麼改) 舉個例子來說明好了 https://gist.github.com/1279325 我想讓我的 Controller 完全負責管理 _object 物件的生命週期 可是這個物件有好幾個可能的形態 我把它們的 interface 統一成了一個 (abstract) base class Base 然後讓 ExtendA 或 ExtendB 繼承它, 各自實作繼承來的 pure virtual methods 在 Controller 中就用這個 interface 來使用 _object 上面程式碼中的做法完全可以動 可是很明顯當我呼叫 setObject() 時就會發生 memory leakage 因為 _object 被我 cast 成 Base * 了, 解構式不會釋放 _memberA 或 _memberB 我現在的方法是在 Controller 中存一個 enum 變數, 標記使用的 type 為何 然後在 setObject 中根據這個變數判斷, 把 _object cast 回原本的形態後再刪除 可是這樣整個設計都很詭異, 有點失去多型的意義 更何況如果以後要增加一個 ExtendC ExtendD 等等等的時候... 我知道 template 可以對付這類狀況 可是在實際設計中, Controller 其實是要繼承一個 non-template class 所以我不能把 Controller 設計成 template 不知道有沒有比較有設計經驗的人能為我解釋一下這種問題要怎麼解決 另外我是半途出家的, 對 C++ 的程式架構設計沒什麼瞭解 在 dynamic-binding 語言這根本不存在任何問題 或者像 Java 有 Class 類別也可以輕鬆解決 所以如果這個設計在 C++ 中很蠢也請不要扁我 orz -- Les grandes et les meilleurs tone from "Zadok the Priest" Eine grosse stattliche Veranstaltung by F. Handel THE MAIN EVENT! These are the men Sie sind die Besten "Champions League" by Tony Britten THESE ARE THE CHAMPIONS! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.81.146
tomap41017:destructor不是virtual的嗎?這樣還會leak?? 10/12 07:41
loveme00835:VC6? 10/12 08:47
philip:~Base()會執行啊,從何判斷memory leak的啊@@ 10/12 08:56
LPH66:dtor 是 virtual 的 所以會執行到子類別的 dtor 10/12 09:56
LPH66:然後子類別的 dtor 的最後一步是呼叫父類別的 dtor 10/12 09:57
LPH66:所以一切都沒什麼問題... 10/12 09:57
LPH66:你可以在各自的 dtor 加一行印字的程式來驗證 10/12 09:58
uranusjr:結果好像是我搞錯了, 是有 leakage 沒錯, 不過不是這個原 10/12 18:03
uranusjr:因, 感謝澄清 :q 10/12 18:03