返回C++多态对象(接口)

Rom*_*n L 5 c++ oop ownership

我想知道从函数返回指向多态对象的指针时,最好的做法是什么,例如在使用工厂时.如果我转让所有权,我应该退货boost::unique_ptr<Interface>吗?如果我不转让所有权(例如,返回对成员的引用),我应该返回什么?是否有一种替代的,非基于增强的方式,也常用?谢谢.

编辑:它应该是C++ 03兼容的,可以轻松升级到0x

编辑2:请注意我明确询问常用方法,最佳实践,而不仅仅是"一种方法".一个暗示将来对代码库进行条件搜索和替换的解决方案看起来不是一个好习惯,是吗?

编辑3:关于auto_ptr的另一点是,它弃用了,不管它是什么,所以在界面级别宣传它的用法看起来很奇怪.然后,有人不知道会将返回的指针放入STL容器,依此类推.因此,如果您知道另一种常见的解决方案,欢迎您添加答案.

Omn*_*ous 5

暂时使用::std::auto_ptr,当C++ 0x可用时,切换到::std::unique_ptr.至少在工厂的情况下,您将所有权交还给来电者.

::std::auto_ptr有问题,很难看.是的,它在C++ 0x中被弃用了.但这是推荐的方法.我没有检查::boost::unique_ptr,但没有移动语义,我没有看到它可以做得更好::std::auto_ptr.

我更喜欢通过搜索和替换进行升级的想法,尽管有一些不寻常的情况会产生预期的结果.幸运的是,这些情况会产生编译错误:

::std::auto_ptr<int> p(new int);
::std::auto_ptr<int> p2 = p; 
Run Code Online (Sandbox Code Playgroud)

必须至少成为这样的

::std::unique_ptr<int> p(new int);
::std::unique_ptr<int> p2 = ::std::move(p);
Run Code Online (Sandbox Code Playgroud)

我更喜欢搜索和替换,因为我发现使用宏和typedef这样的事情往往会使事情变得更加模糊,以后难以理解.如果需要,可以有选择地应用代码库的搜索和替换(::std::auto_ptr不会在C++ 0x中消失,它只是被弃用)并且使代码具有明确且明显的意图.

至于"通常"做了什么,我认为问题已经存在很长时间,因为有一个普遍接受的处理转换的方法.

  • +1 - `std :: auto_ptr`虽然人们一直在抨击它,但它真棒. (2认同)