问题标签 [rule-of-five]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
90 浏览

c++ - 具有继承实现的 C++ 规则 5

按照网上教程中关于5的规则的例子,我写了这个类:

并且做一些测试它实际上似乎对我有用(它是通过示例中的一些自定义复制的)。

所以我尝试创建一个继承自 A2 的类(在这种情况下,作为构造函数参数的文本也传递给父级,但在它们的内部管理中它们保持独立):

它似乎工作正常(我也在这里做了一些测试,并检查了调试器是否一切正常)。

但我的疑问是:为 B2 课写的内容是否正确?我不太相信直接使用运算符(A2::operator = (other)并将A2::operator = (static_cast <A2&&> (other)))参数传递给父级。

有什么方法可以更清晰、更正确地编写相同的代码?

0 投票
0 回答
120 浏览

c++ - 根据构造函数实现 C++ 赋值运算符

背景

假设您想在 C++ 中实现一个资源管理类。您不能使用规则或五个默认规则,因此您实际上需要实现复制和移动构造函数、复制和移动赋值运算符和析构函数。在这个问题中,我将Box用作示例,但这可以适用于许多不同的类型。

(请注意,更好的Box实现将具有更多的特性,例如noexceptconstexpr函数、explicit基于构造函数的转发构造value_type函数、分配器支持等;这里我正在实现问题和测试所必需的东西。它还可以使用 保存一些代码std::unique_ptr,但这会使它成为一个不太清楚的例子)

请注意,赋值运算符彼此共享大量代码,与它们各自的构造函数和析构函数共享。如果我不想让分配到从Boxen 移动,这会有所减轻,但在更复杂的类中会更明显。

题外话:复制和交换

处理此问题的一种标准方法是使用Copy-And-Swap Idiom(在此上下文中也称为“四半规则”)swap ,如果是,它还可以为您提供强有力的异常保证nothrow

这允许您只编写一个赋值运算符(other如果可能,按值取值让编译器将另一个移动到参数,并在必要时为您进行复制),并且该赋值运算符很简单(假设您已经拥有swap)。但是,正如链接文章所说,这存在诸如在操作期间进行额外分配和保留内容的额外副本等问题。

理念

我以前没有见过的是我称之为销毁和初始化赋值运算符的东西。既然我们已经在构造函数中完成了所有工作,并且对象的分配版本应该与复制构造的对象相同,为什么不使用构造函数,如下所示:

这仍然像 Copy-and-Swap 那样进行额外分配,但仅在复制分配情况下而不是在移动分配情况下,并且它销毁 的一个副本后进行T,因此它不会在资源限制下失败。

问题

  1. 以前是否有人提出过这个建议,如果有,我可以在哪里阅读更多相关信息?
  2. 在某些情况下,这个 UB 是否Box是其他东西的子对象,或者它是否允许销毁和重建子对象?
  3. 这有什么我没有提到的缺点吗,比如不constexpr兼容?
  4. 当您不能只使用它们时,是否还有其他选项可以避免赋值运算符代码重用,例如这个和四点半规则= default
0 投票
1 回答
68 浏览

c++ - 这是五规则(或四和 1/2 规则)的正确实施吗?

我正在研究五法则及其表亲(四法则和 1/2、复制和交换成语、朋友交换功能)。

我在测试课上实施了四和 1/2 规则。它编译得很好。我的实施中是否有任何隐藏的错误?

我特别关注存储在我在复制构造函数中移动的m_unorederd_map属性中的 unique_ptrs,因为它们无法被复制。这是在类中处理 unique_ptrs 的正确方法吗?

某个类.h

某类.cpp