C++ smart_ptr和虚拟函数的习惯用法

C++ smart_ptr和虚拟函数的习惯用法,c++,pointers,inheritance,smart-pointers,virtual-functions,C++,Pointers,Inheritance,Smart Pointers,Virtual Functions,在我正在编写的代码中,我希望尽可能多地依赖智能指针。我现在有一个问题,当我想使用动态分派时,这基本上不是智能指针的问题,在被调用的虚拟函数中,这也是一个裸指针,并且被剥夺了所有智能指针信息 为了说明这一点,请考虑下面的基类< /P> class Base { virtual smart_ptr<Base> do_stuff(int some_param); } 以及使用该类和派生类的片段 smart_ptr<Base> ptr = smart_ptr<Base

在我正在编写的代码中,我希望尽可能多地依赖智能指针。我现在有一个问题,当我想使用动态分派时,这基本上不是智能指针的问题,在被调用的虚拟函数中,这也是一个裸指针,并且被剥夺了所有智能指针信息

为了说明这一点,请考虑下面的基类< /P>

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实现,应该可以只返回原始智能指针,或者返回一个新的智能指针,该指针包含旧的智能指针,甚至返回一个全新的对象。当然,当我说原始智能指针时,它不必是同一个对象,但它需要链接到相同的管理信息,如ref counter、linked list或ptr等。很明显,我不会使用Smartptrthis来实现这一点,但是有什么替代方案呢?我目前看到的唯一选择是

将智能指针也传递到do_东西,比如do_stufsmart_ptr This,int some_param,断言This==This.get,然后使用它? 将智能指针保留在全局哈希表或Base中的静态成员中,并在do_stuff中查找到该表中,如下所示=Base::ptrs[This]? 他们两个都很丑。第一个可以通过

将do_stuff重命名为do_stuff,使其受到保护,并提供一个friend函数do_stuff Smart_ptr ptr ptr,int param,返回ptr->do_stuff ptr,param。
然而,对于应该是类成员的方法,我不喜欢friend函数业务。我看到的有什么好的C++习语吗?它最好与C++03一起使用。

简单:不要从函数返回它。由于您刚刚调用了该函数,因此您必须有一种方法来访问该对象。。。有一个例外,您将返回*this,并且只使用它来链接另一个方法。但是它需要链接到相同的管理信息。您这样说是因为您需要跟踪foo和ptr之间的关系,还是foo是ptr的某种转换?您可能想看看std::shared\u from\u this andstd::make_shared.@Guvante好吧,如果foo包含一个智能指针,指向与ptr相同的对象new Derivedparam,并且两者都有自己的引用计数器,那么代码可能会在某个点引用一个已经删除的对象,并且会删除该对象两次。因此,它们必须使用相同的参考计数器。我刚才说的“管理信息”是因为,您不必通过引用计数来意识到这一点。@重复数据消除是的,这看起来很不错。使用boost时,它也应该与C++03一起工作。