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

作者: darkhcv (我只想耍廢)   2016-06-20 17:29:11
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
或者是有第四種更好的寫法?
作者: LPH66 (-6.2598534e+18f)   2016-06-20 18:36:00
IBase 應該要有一個 virtual dtor, 不然當這物件以 IBase*指著時, delete 不會去呼叫 Derived 的 dtor然後你的問題可以試試 RAII 的寫法
作者: IKAFIRE (沒有)   2016-06-20 19:08:00
大部份的OS在程式crash後就把記憶體收回去了不會leak吧
作者: AIGecko (師大貓耳控)   2016-06-20 20:16:00
題外話 你要說的虛擬碼應為pseudocode

Links booklink

Contact Us: admin [ a t ] ucptt.com