我想知道,当从函数返回指向多态对象的指针时(例如在使用工厂时),最佳实践现在被认为是什么。如果我转移了所有权,我应该返回boost::unique_ptr<Interface>吗?如果我不转移所有权,我应该返回什么(例如,返回一个成员的引用)?有没有一种替代的,非基于助推的方式,也是常用的?谢谢。
编辑:它应该是C++03兼容的,可以轻松升级到0x。
EDIT2:请注意,我明确询问的是常见的方法、最佳实践,而不仅仅是“一种方法”。将来在代码基上暗示条件搜索和替换的解决方案看起来不像是一个好的实践,对吗?
EDIT3:关于auto_ptr的另一点是,不管它多么整洁,它都是不受欢迎的,所以在接口级别上宣传它的用法看起来很奇怪。然后,不知情的人会将返回的指针放入STL容器,以此类推。因此,如果您知道另一个常见的解决方案,我们非常欢迎您添加一个答案。
发布于 2011-01-20 16:59:07
现在使用::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);我更喜欢搜索和替换,因为我发现在这种情况下使用宏和类型往往会使事情变得更加模糊和难以理解。如果需要的话,搜索和替换代码库可以有选择地应用(::std::auto_ptr不会在C++0x中消失,它只是被废弃了),并以明确和明显的意图离开您的代码。
至于“通常”做了什么,我不认为这个问题已经存在了足够长的时间,没有一个普遍接受的方法来处理转换。
https://stackoverflow.com/questions/4749975
复制相似问题