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

时间:2011-01-20 16:46:27

标签: c++ oop ownership

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

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

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

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

1 个答案:

答案 0 :(得分: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; 

必须至少成为这样的

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

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

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