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

标签 c++ oop ownership

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

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

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

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

最佳答案

现在使用 ::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 中消失,它只是被弃用了)并使您的代码清晰明了明显的意图。

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

关于c++ - 返回 C++ 多态对象(接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749975/

相关文章:

c++ - 将 c++0x 线程与 gio GCancellable 混合使用是否合法?

c++ - 寻找同构排列集的算法

objective-c - 为什么不能将 ivar 的地址传递给 ARC 下的 "id __autoreleasing *"参数?

rust - 如何返回对结构中嵌套条目的子元素的引用?

rust - 在 Rust 中,我怎样才能减少这段代码的重复性?

c++ - 如何在 MFC/MDI 项目中指定 CDialogBar 的大小?

c++ - 打印二维 vector 指针

javascript OOP 继承多个 DOM 元素的方法

javascript - 如何从 JavaScript 的公共(public)方法中访问私有(private)属性?

php - 在 PHP 中为重要类创建一个好的注册表类