[討論] 關於base pointer指向derived的寫法問題

看板C_and_CPP作者 (我只想耍廢)時間8年前 (2016/06/20 17:29), 編輯推噓2(203)
留言5則, 3人參與, 最新討論串1/1
class IBase { virtual void fun() = 0; } class Derived : public IBase { virtual void fun() { /* doing something */} listener* get_listener() { return listener_; } } void SomeClass::somefunc() { Derived* derived_ = new Derived(); listener* listener = derived_->get_listener(); /* using listener to register something */ base = boost::shared_ptr<IBase>(derived); ... } 基本的情境大概是上面的sudo code 我用IBase定義了一些method interface 然後用Derived去implement 打算存在boost::shared_ptr<IBase>裡 可是在這之前我可能需要用Derived才有的一些function去做些初始化 (Ex. regist observer) 但總覺得先用一個Derived的pointer指向new出來的東西 做完再把它轉給Base的smart pointer好像寫的有點噁心 而且如果程式在轉給smart pointer前crash應該就會leak了 我現在想的到一是像上面這樣寫 二是先用boost::shared_ptr<Derived> derived(new Derived); 然後做完初始化後轉給base去keep住 三是直接一開始就用base接,然後dynamic_cast成Derived去做初始化 想請教一下這種需求下,哪一種寫法比較好? 我自己是覺得最爛的應該是一,二和三至少不會crash時leak 或者是有第四種更好的寫法? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.58.205 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1466414956.A.DCC.html

06/20 18:36, , 1F
IBase 應該要有一個 virtual dtor, 不然當這物件以 IBase*
06/20 18:36, 1F

06/20 18:37, , 2F
指著時, delete 不會去呼叫 Derived 的 dtor
06/20 18:37, 2F

06/20 18:37, , 3F
然後你的問題可以試試 RAII 的寫法
06/20 18:37, 3F

06/20 19:08, , 4F
大部份的OS在程式crash後就把記憶體收回去了不會leak吧
06/20 19:08, 4F

06/20 20:16, , 5F
題外話 你要說的虛擬碼應為pseudocode
06/20 20:16, 5F
文章代碼(AID): #1NPxTitC (C_and_CPP)