问题标签 [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 投票
5 回答
585 浏览

c++ - 我违反了三原则吗?

我最近读到,三法则,我想知道我是否违反了它?

在我的 GUI 应用程序中,像MainFrame, Interface,CircuitBreadboard类(类名是指示性的)每个都有一个实例。在它们的构造函数中,我分配了一些资源(内存),我在它们的析构函数中安全地释放了这些资源。

所以我只定义了析构函数,没有定义复制构造函数赋值运算符

我确定我不需要它们,但我很好奇我是否违反了规则,我可以/应该做什么来遵守它?

0 投票
3 回答
1588 浏览

c++ - C++中的三法则

我读过三法则,三法则是什么?总结如下:

如果您需要自己显式声明析构函数、复制构造函数或复制赋值运算符,您可能需要显式声明所有这三个。

我的问题是:在 C++ 应用程序中,我有一个管理资源的类(有一个处理删除指针的析构函数)。我知道应用程序到处都使用赋值运算符,但我绝对确定在应用程序中没有使用复制构造函数,即类型的使用,Class c(..); Class d(c);所以在这种情况下,我仍然需要同时实现赋值运算符和复制构造函数?还是仅一个赋值运算符就足够了?赋值运算符是否有可能以某种方式使用复制构造函数?

欣赏你的想法。

0 投票
2 回答
20471 浏览

c++ - 理解-Weffc++

考虑以下程序:

-Weffc++在 GCC 4.7.1 上编译时会输出:

这通常没问题,除了这个例子中的几件事:

  1. 如果我注释掉任何构造函数、指针声明或字符串声明,警告就会消失。这很奇怪,因为您认为仅指针就足够了,但事实并非如此。此外,将字符串声明更改为整数声明也会导致它消失,因此它仅在存在字符串(或可能其他选择类)时出现。为什么在这种情况下警告会消失?

  2. 当所有指针都指向现有变量(通常由操作系统维护)时,通常会出现此警告。没有new,也没有delete。在这些情况下,当复制带有句柄的类时,我不想要深拷贝。我希望两个句柄都指向同一个内部对象(例如窗口)。有没有办法让编译器实现这一点,而无需不必要地重载复制构造函数和赋值运算符,或者完全禁用警告#pragma?当三法则甚至不适用时,为什么我首先会受到困扰?

0 投票
1 回答
75 浏览

c++ - 矢量没有正确擦除内容(复制分配运算符的无限量运行直到崩溃 [BEX])?

好吧,我的问题是,在我想“卸载”加载的 DLL 之后,复制分配运算符被无限次调用,直到崩溃。

我从中删除矢量数据的代码如下所示:

但是“[DBG]UnloadPlugins()::Done”永远不会被打印出来。

这是我的复制分配运算符:

所以日志看起来像:

问题可能是什么?

0 投票
3 回答
2281 浏览

c++ - 缺少默认构造函数 - 但我没有调用它?

我正在编写一个 C++ 应用程序,其中我有一个Controller带有两个嵌套结构的类,在我的头文件中定义如下:

在我的源文件中,我有这个:

我认为这很好,但是当我编译时,这就是我得到的(controller.cpp 第 12 行是上面源代码片段的第一行):

据我推断,编译器在某处试图调用help_message不存在的默认构造函数。然后它尝试将调用与我创建的构造函数以及生成的复制构造函数和赋值运算符匹配,并在参数数量上失败。

但是我的代码的哪一部分调用了默认构造函数?我该如何解决这个错误?

0 投票
3 回答
1417 浏览

c++ - 三法则的例外?

我已经阅读了很多关于 C++规则三的内容。许多人对此发誓。但是当规定规则时,它几乎总是包含“通常”、“可能”或“可能”这样的词,表示存在例外情况。我还没有看到太多关于这些例外情况可能是什么的讨论——三法则不成立的情况,或者至少坚持三法则没有任何优势的情况。

我的问题是我的情况是否是三原则的合法例外。我相信在我下面描述的情况下,显式定义的复制构造函数和复制赋值运算符是必要的,但默认的(隐式生成的)析构函数可以正常工作。这是我的情况:

我有两个类,A 和 B。这里有问题的是 A。B 是 A 的朋友。A 包含一个 B 对象。B 包含一个 A 指针,该指针旨在指向拥有 B 对象的 A 对象。B 使用此指针来操作 A 对象的私有成员。除了在 A 构造函数中之外,B 永远不会被实例化。像这样:

和...

我为什么要这样设置我的课程?我保证,我有充分的理由。这些类实际上比我在这里所包含的要多得多。

所以剩下的很简单,对吧?没有资源管理,没有三巨头,没问题。错误的!A 的默认(隐式)复制构造函数是不够的。如果我们这样做:

我们得到一个新的 A 对象a2,它与 相同a1,意思a2.b是相同的a1.b,意思a2.b.ap是仍然指向a1!这不是我们想要的。我们必须为 A 定义一个复制构造函数,它复制默认复制构造函数的功能,然后将 new 设置A::b.ap为指向新的 A 对象。我们将此代码添加到class A

出于同样的原因,复制赋值运算符是必要的,并且将使用复制默认复制赋值运算符的功能然后调用b.init( this );.

但是不需要显式的析构函数;因此,这种情况是三法则的一个例外。我对吗?

0 投票
2 回答
4192 浏览

c++ - C++析构函数,动态分配

由于缺少析构函数,我最近遇到了一些错误(bad_alloc)。

我目前有两个类,以这种方式设置:

这是我的运算符 = ObjTwo

首先,我的假设是(如果不正确,请更正这些):

ObjOne 不需要析构函数,因为它只是原始类型,编译器何时会使用默认析构函数来清理它。ObjTwo 确实需要一个析构函数,因为它包含 ObjOne ObjTwo 析构函数需要从 x、num 和 myObjOne 释放内存。

我已经在析构函数上做了一些尝试,但是我仍然遇到了 bad_alloc 错误(在使用巨大的循环等进行测试时)或其他错误(当前的错误在调用析构函数时会崩溃)。

感谢任何关于我做错的指导

编辑:当我简单地将它放在一个循环中时,我抛出了一个 bad_alloc 异常:

这是重载的 == 运算符

在阅读了一些错误之后,它似乎是由于内存不足引起的;我无法正常工作的析构函数会导致。这里可能是什么问题?

get 方法只返回 jon[i];

0 投票
1 回答
102 浏览

c++ - 内存管理:字符数组和 = 运算符

内存管理:字符数组和 = 运算符

问:在内存管理方面,您使用以下代码会有什么错误?

回答。我不知道...你能帮帮我吗?数组大小似乎还可以......新运算符......是因为没有删除运算符而导致悬空指针吗?还是三法则?

我会很感激你的帮助!请告诉我。谢谢,

0 投票
1 回答
908 浏览

c++ - 三法则。复制构造函数、赋值运算符实现

三法则。复制构造函数、赋值运算符实现

显然,这需要有三法则。你能帮我定义它们吗?

Q0。

这是否会创建调用默认构造函数的 ip 对象,然后调用复制构造函数?我对吗?

Q1。定义析构函数。

这是对的吗?

Q2。定义复制构造函数。

Q3。定义赋值运算符。

谢谢,我将不胜感激!

0 投票
1 回答
82 浏览

c++ - 不同类型的 C++ 模板错误

我需要从下面找到所有可能的错误,至少三个错误。

我的回答是

  1. typename A 和 B 可能有不同的类型,会出错,更糟糕的是,操作符 < 没有在函数中定义。

  2. typename C 可以不同于 A 和 B,然后它对定义为 const 的 a、b 对象进行更改

  3. typename A 可以是整数类型,但我们不使用整数类型的常量引用,我们只将它用于对象。

我的第三个答案是错误的......

任何人都可以解释为什么我的答案是错误的,以及这个模板可能出现的所有可能的错误吗?我得到了前两个答案的功劳,但我真的不喜欢它们。有人对此有更好的解决方案吗?

谢谢,