smart_ptr和虚函数的成语

时间:2015-01-28 17:34:11

标签: c++ pointers inheritance smart-pointers virtual-functions

在我写的代码中,我想尽可能多地依赖智能指针。我现在遇到的问题是,当我想使用动态调度时(智能指针基本上不是问题),在被调用的虚函数中,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),但有哪些替代方案呢?我目前看到的唯一替代方案是

  1. 将智能指针也传递到do_stuff,如do_stuff(smart_ptr<Base> This, int some_param),断言this == This.get(),然后使用This
  2. 将智能指针保存在全局哈希表(或Base中的静态成员)中,并在do_stuff中查找该表(如This = Base::ptrs[this])?
  3. 他们两个都很难看。

    可以使第一个更好一些
    1. do_stuff重命名为do_stuff_,使其受到保护并提供友情函数do_stuff(smart_ptr<Base> ptr, int param),该函数返回ptr->do_stuff_(ptr, param)
    2. 但是,对于那些应该是类成员的方法,我不喜欢那个朋友函数业务。有没有我见过的很好的C ++成语?最好使用C ++ 03。

0 个答案:

没有答案