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
或者是有第四种更好的写法?