[讨论] 关于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