问题标签 [default-copy-constructor]

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 投票
2 回答
166 浏览

c++ - 复制构造函数是否重新初始化文件成员

我遇到了一个有趣的案例:

我有一个文件流作为类的成员,还有一个在文件中写入数据的函数。该对象作为参数传递给另一个使用该参数初始化其成员的类。因此,我遇到了一些问题,我设法用字符串向量解决了这些问题,并在其中添加了行。但现在我发现我仍然将对象从一个类传递到另一个类。

这是我所拥有的一个例子:




我有一个函数,我创建一个 C 对象并调用它的foo()方法:

我不确定这里发生了什么。ofstream 是否创建了不止一次?它只创建一次然后重新打开?你会建议我在每个析构函数中添加oFile.close()函数吗?我应该仅将向量作为参数传递并仅在bar()函数中使用 ofstream 吗?

0 投票
4 回答
1131 浏览

c++ - Uncopyable class with automatic default and move constructors

I want to make some classes use automatically generated constructors, but be non-copyable (but still movable). Currently I'm doing it like this:

I wonder if it's really necessary to be so explicit. What if I wrote it like this:

Would it still work the same? What is the minimal set of defaults and deletes for other cases - non-copyable non-movable class, and class with virtual destructor?

Is there any test code I can use to quickly see which constructors are implicitly created?

0 投票
1 回答
625 浏览

c++ - 复制构造函数和链接错误

让我们看一下这段代码:

如果我通过以下方式创建此类的对象:

这会调用默认的复制构造函数,它会自动分配 mc2.m_num = mc1.m_num ?此外,如果类内部有一个调用,它会以下列方式创建一个实例:

这将调用与 mc2 相同的默认复制构造函数 *this 只是让对象本身被复制?

我遇到的第二个问题是使用 Microsoft Visual Studio 2013 编译我的代码。我创建了一个 String 类,当我尝试编译时,我收到很多链接错误,告诉我这些函数由于某种原因已经定义。字符串.h:

};

字符串.cpp:

代码文件:

错误:

0 投票
2 回答
174 浏览

c++ - 拦截 C++ 隐式复制构造函数,或调用其功能

鉴于:

...其中“东西”可以是任何一组属性。(这个想法是有一个该类实例的计数器)

然后:

将调用自动复制构造函数,因此我会错过计算这个。

有没有办法让该计数器反映自动创建的新实例?如果我实现显式复制构造函数,我将不得不一一分配所有属性。但是,我想要一个浅的、按成员的副本。我不需要执行深层复制,因此实现显式复制构造函数似乎有很多不必要的工作。

0 投票
3 回答
302 浏览

c++ - 关于复制构造

如果我使用构造初始化并且它是正确的。但是如果使用“price(orig.price)”会出错,为什么?

0 投票
2 回答
627 浏览

c++ - 类复制构造函数和指向成员函数

我有一个大程序,其中包含一些使用指向成员函数的类。一般的代码结构是:

此代码按原样编译。但是,我的问题是:在这种情况下,我是否需要定义复制构造函数和/或析构函数?

例如,我可以定义

但我认为这可以由编译器默认给出。另外,我不确定默认析构函数,因为涉及到一个指针。

0 投票
2 回答
4397 浏览

c++ - 在构造函数上联合使用已删除函数的类

我正在尝试创建一个 4*4 矩阵的类,它是由 16 个浮点数的数组构建的,但我也想将它表示为 4 个 vec4 的数组(对于每一列)。问题是它不能编译,并且无论我在哪里调用 mat4 的构造函数都会出错。
我的 mat4.h:

我的 mat4.cpp:

我的 vec4.h:

我的 vec4.cpp:

和错误日志:

我认为大部分代码是无关紧要的,所以不要费心阅读所有代码。只是为了比较起见,如果我vec4 columns[4];从 mat4.h 的联合中删除链接,那么一切都很棒。

在过去的一个小时里,我一直在为此烦恼,所以我真的需要一些帮助。

谢谢。

编辑:

在尝试了@0x499602D2 的建议并添加mat4(mat4&&) = default;到 mat4.h 之后,我只剩下一个错误:

我能做些什么来解决这个问题?

0 投票
7 回答
2749 浏览

c++ - C++ 的默认复制构造函数本质上是不安全的吗?迭代器从根本上来说也是不安全的吗?

当遵循最佳实践时,我曾经认为 C++ 的对象模型非常健壮。
然而,就在几分钟前,我意识到了我以前从未有过的。

考虑这段代码:

我写过这样的代码。直到今天,我还没有看到它有问题。

但是,再想一想,我意识到这个类非常糟糕:
它的复制构造函数和复制赋值复制了内部的迭代器vector,这意味着它们仍然会指向 set的!新的毕竟不是真正的副本!

换句话说,即使这个类没有管理任何资源(没有 RAII) ,我也必须手动实现复制构造函数!

这让我感到惊讶。我以前从未遇到过这个问题,我也不知道有什么优雅的方法可以解决它。再想一想,在我看来,默认情况下复制构造是不安全的——事实上,在我看来,默认情况下类不应该可复制的,因为它们的实例变量之间的任何类型的耦合都有可能呈现默认副本-构造函数无效

迭代器从根本上来说存储不安全吗?或者,默认情况下类真的应该是不可复制的吗?

下面我能想到的解决方案都是不可取的,因为它们不允许我利用自动生成的复制构造函数:

  1. 为我编写的每个重要类手动实现一个复制构造函数。这不仅容易出错,而且为一个复杂的类编写起来也很痛苦。
  2. 永远不要将迭代器存储为成员变量。这似乎受到严重限制。
  3. 在我编写的所有类上默认禁用复制,除非我能明确证明它们是正确的。这似乎完全违背了 C++ 的设计,该设计对于大多数类型来说都具有值语义,因此是可复制的。

这是一个众所周知的问题吗?如果是,它是否有一个优雅/惯用的解决方案?

0 投票
1 回答
209 浏览

c++ - 需要用互斥锁明确定义的复制构造函数

在我的代码中,我没有故意为 Complex 和 Composition 类定义复制构造函数。我希望使用编译器提供给我的复制构造函数

上面的代码编译没有任何问题。

现在我将复杂类更改为以下

当我编译代码时,我得到了错误

我现在通过在 Composition 中定义我自己的复制构造函数和一个空的主体来解决这个问题。

但是,我仍然不确定为什么我必须在一种情况下创建自己的复制构造函数,并且能够通过编译器生成的另一种情况来解决。罪魁祸首当然是互斥体。是创建此问题的互斥锁的不可复制属性还是我缺少的其他东西?

0 投票
2 回答
66 浏览

c++ - 记住原来只能管理共享内存的对象

我有一个关于良好 C++ 风格的问题:我想编写一个类“MyClass”,它有一个或一些指针作为成员,并且 MyClass 能够为这些指针分配内存。我想使用隐式给出默认复制构造函数(以及默认赋值操作符)来复制 MyClass 的一个实例,以便只复制指针并且新对象共享初始对象具有的数据分配。

我的想法是禁止复制对象(使用复制构造函数或赋值运算符创建)释放内存(以及为成员指针分配内存)。为了区分复制的对象和原始对象(由构造函数创建),我想使用以下代码:

这个解决方案(使用与this-pointer 的比较)会是一个好的风格(例如通过按值调用解析对象)还是有风险?当然,我假设原始对象的寿命总是比复制的对象长。

谢谢!