在我写的代码中,我想尽可能多地依赖智能指针。我现在遇到的问题是,当我想使用动态调度时(智能指针基本上不是问题),在被调用的虚函数中,this
再次是一个裸指针并且被剥夺所有的智能指针信息。
为清楚起见,请考虑以下基类
class Base {
virtual smart_ptr<Base> do_stuff(int some_param);
}
和使用此类和派生类的片段;
smart_ptr<Base> ptr = smart_ptr<Base>( new Derived(param1) );
smart_ptr<Base> foo = ptr->do_stuff(2);
对于do_stuff
中的Derived
实现,应该可以只返回原始智能指针,或者包装旧的智能指针或甚至是一个全新的对象。当然,当我说“原始智能指针”时,它不必是同一个对象,但它需要链接到相同的管理信息(如ref计数器,或链接列表或其他)作为ptr
。我显然不会使用smart_ptr<Base>(this)
,但有哪些替代方案呢?我目前看到的唯一替代方案是
do_stuff
,如do_stuff(smart_ptr<Base> This, int some_param)
,断言this == This.get()
,然后使用This
?do_stuff
中查找该表(如This = Base::ptrs[this]
)?他们两个都很难看。
可以使第一个更好一些do_stuff
重命名为do_stuff_
,使其受到保护并提供友情函数do_stuff(smart_ptr<Base> ptr, int param)
,该函数返回ptr->do_stuff_(ptr, param)
。但是,对于那些应该是类成员的方法,我不喜欢那个朋友函数业务。有没有我见过的很好的C ++成语?最好使用C ++ 03。