问题标签 [rule-of-three]

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 回答
59 浏览

c++ - C++向量丢失堆分配的指针

我在下面写了一个简单的程序来解释。

我希望as包含 3 个A实例。但是在调用第二次push_back
后,第一个元素 的指针x失去了它的引用(写入的虚拟值),并且在第 3 次迭代时抛出了异常。

这是在 for 循环之前添加as.reserve(3)解决的。

为什么会这样?

0 投票
1 回答
1113 浏览

c++11 - Move assignment operator, move constructor

I've been trying to nail down the rule of 5, but most of the information online is vastly over-complicated, and the example codes differ.

Even my textbook doesn't cover this topic very well.

On move semantics:

Templates, rvalues and lvalues aside, as I understand it, move semantics are simply this:

As apposed to copying, which would be the equivalent of something like this:

No explanation of rvalues, lvalues or templates is necessary, I would go as far as to say those topics are unrelated.

The fact that the first example is faster than the second, should be a given. And I would also point out that any efficient code prior to C++ 11 will do this.

To my understanding, the idea was to bundle all of this behavior in a neat little operator move() in std library.

When writing copy constructors and copy assignment operators, I simply do this:

The equivalent, one would think, would be this:

I'm quite certain this won't work, so my question is: How do you achieve this type of constructor functionality with move semantics?

0 投票
2 回答
1595 浏览

c++ - C++ 中的资源是什么?

关于这个话题:什么是复制和交换成语?

它指出一个类最多应该处理一种资源。资源是什么意思?

编辑:例如,我有一个类处理每个监视器的信息,并包含一个桌面像素数组。数组并且只有数组会被视为资源吗?保存监视器信息的监视器阵列和桌面像素阵列是否是另一个资源,需要另一个类?它在另一个班级,但这是什么意思?

我在这里和谷歌搜索过,但只找到与三规则或资源文件(*.rc 和 MSDN)相关的更多信息。没有什么与定义有关。

0 投票
0 回答
38 浏览

c++ - 需要建议在 c++ 中找到正确的 WrapperInterface 实现(三规则)

我试图找到一个界面的工作模式。

我在做什么的一些信息。我在 dx11 中实现了一个渲染引擎。我的目标是提供一个简单且高度接口的引擎,其中客户端不必具备任何 dx11 或高级渲染技术的知识。

我有我的引擎,该引擎提供了设置和创建任何对象、地形、太阳、照明、水、地平线和和和的功能。

现在我来回答我的问题。我所谓的引擎MeshController提供了这3个方法(代码被简化):

为了避免客户端处理指针,我尝试将其打包在一个包装类中,该类将执行 nullptr 检查,检查实体是否已被销毁或已创建等等。

包装:

现在我希望对象始终处于有效状态。如果实例在丢失包装对象之前没有被销毁,它会造成内存泄漏(不是真的,但是我的控制器会渲染它直到场景关闭,或者会阻塞一个实例槽,总而言之,客户端将失去对实例)。所以我的第一个想法是这样的:

由于三规则,我需要复制和赋值运算符。但是问题就来了。createInstance 和 destroyInstance 方法有很多开销,因为在场景中添加/删除,可能会重新创建渲染缓冲区......

所以现在我尝试找到任何方法来防止对象被破坏,如果它之前被复制过,或者如果它有一个有效的引用(指针)。这不是典型的动态内存分配,而是我的控制器中的某种分配。

客户端的典型用例:

这是一些激励的图像^^ 我的渲染引擎的图像

谢谢你的帮助!

0 投票
2 回答
1421 浏览

c++ - CppCoreGuidelines C.21 是否正确?

在阅读 Bjarne Stroustrup 的 CoreCppGuidelines 时,我发现了一个与我的经验相矛盾的指南。

C.21需要以下内容:

如果您定义或=delete任何默认操作,请定义或=delete全部

原因如下:

特殊函数的语义密切相关,因此如果需要非默认,则很可能其他函数也需要修改。

根据我的经验,重定义默认操作最常见的两种情况如下:

#1:使用默认主体定义虚拟析构函数以允许继承:

#2:定义默认构造函数,对 RAII 类型的成员进行一些初始化:

根据我的经验,所有其他情况都很少见。

你怎么看这些例子?它们是 C.21 规则的例外,还是最好在此处定义所有默认操作?还有其他常见的例外吗?

0 投票
0 回答
27 浏览

c++ - 如何用它的成员编写一个类是一个指向自己定义类的指针向量

我是 C++ 新手,我正在尝试编写一个 CarRental 类,其中包含一个指向基类 Car 的指针向量。这是汽车类。

我需要编写一个 CarRental 类,其中包含用于存储汽车的容器。例如,

我怀疑我写的 CarRental 类是否正确。我正在考虑是否需要编写自己的复制构造函数。到了大三,我还需要赋值运算符和析构函数吗?三个会不会有内存泄漏?异常安全性如何?

0 投票
1 回答
730 浏览

c++ - 正常块后检测到堆损坏 (#181)

(首先对不起英语,因为我不擅长它)

我已经为幻方编写了一个代码,它可以正常工作并给出真正的平方。

当它被编译并且我运行程序时,没有任何问题。

但是当它到达时return 0main()得到这个错误

正常块后检测到堆损坏 (#180)

我搜索了一下,发现我的square班级没有遵守三规则(什么是三规则?

所以我试了一下,又得到了错误。

这是我的代码。

不是关于问答,这是编辑后的代码,这里是运行新代码的链接 http://cpp.sh/72mmg

0 投票
1 回答
71 浏览

c++ - 链表复制构造函数崩溃程序

我不确定为什么我的复制构造函数似乎使程序崩溃,所有其他函数在链表类中都很好。5 规则现在真的让我对实施感到困惑。如果有人对我出错的地方有一些指示或指导,请告诉我,谢谢。

DList ctor:

析构函数和复制构造函数:

主要的:

崩溃前的输出:

0 投票
1 回答
385 浏览

c++ - C++11 中的 3 条默认成员弃用规则

根据下面广为人知的表格,当复制赋值、复制构造函数和析构函数中的一个或多个由用户提供时(红色单元格表示弃用)。鉴于“3 规则”,这是完全合理的。但是,该表显示,在用户提供的复制构造函数/赋值的情况下,默认析构函数的生成不会被弃用。

这个设计决定背后的理由是什么?

参考表

0 投票
1 回答
175 浏览

c++ - 为什么删除 Actor 指针会导致“Program.exe 已触发断点”

我正在尝试创建一个Actor指向另一个Actor对象的指针,如下所示:

然后,当我尝试时delete ptr,它会导致运行时错误:

Program.exe 已触发断点

但是,当我创建一个新Actor的而不是分配ptr给 的引用时other,我可以安全地delete使用它而不会出现任何错误:

我不明白问题是什么。

这是我的Actor班级的样子:

演员.h:

演员.cpp:

我已经搜索过,发现了The Rule of Three,但我不明白在设置这样的指针时使用了什么运算符:

我认为它是复制构造函数,但是如何为我的程序实现它呢?