4

我想知道现在从函数返回指向多态对象的指针时被认为是最佳实践,例如在使用工厂时。如果我转让所有权,我应该归还boost::unique_ptr<Interface>吗?如果我不转让所有权(例如返回对成员的引用),我应该返回什么?是否有另一种常用的非基于提升的方法?谢谢。

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

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

EDIT3:关于 auto_ptr 的另一点是它已被弃用,无论它多么整洁,所以在接口级别宣传它的使用看起来很奇怪。然后,不知情的人会将返回的指针放入 STL 容器中,以此类推。因此,如果您知道另一种常见的解决方案,非常欢迎您添加答案。

4

1 回答 1

4

暂时使用::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; 

至少要变成这样

::std::unique_ptr<int> p(new int);
::std::unique_ptr<int> p2 = ::std::move(p);

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

至于“通常”做什么,我认为这个问题已经存在了足够长的时间,以至于没有一种普遍接受的处理转换的方法。

于 2011-01-20T16:59:07.487 回答