问题标签 [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.
c++ - 复制构造函数是否重新初始化文件成员
我遇到了一个有趣的案例:
我有一个文件流作为类的成员,还有一个在文件中写入数据的函数。该对象作为参数传递给另一个使用该参数初始化其成员的类。因此,我遇到了一些问题,我设法用字符串向量解决了这些问题,并在其中添加了行。但现在我发现我仍然将对象从一个类传递到另一个类。
这是我所拥有的一个例子:
我有一个函数,我创建一个 C 对象并调用它的foo()
方法:
我不确定这里发生了什么。ofstream 是否创建了不止一次?它只创建一次然后重新打开?你会建议我在每个析构函数中添加oFile.close()
函数吗?我应该仅将向量作为参数传递并仅在bar()
函数中使用 ofstream 吗?
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?
c++ - 复制构造函数和链接错误
让我们看一下这段代码:
如果我通过以下方式创建此类的对象:
这会调用默认的复制构造函数,它会自动分配 mc2.m_num = mc1.m_num ?此外,如果类内部有一个调用,它会以下列方式创建一个实例:
这将调用与 mc2 相同的默认复制构造函数 *this 只是让对象本身被复制?
我遇到的第二个问题是使用 Microsoft Visual Studio 2013 编译我的代码。我创建了一个 String 类,当我尝试编译时,我收到很多链接错误,告诉我这些函数由于某种原因已经定义。字符串.h:
};
字符串.cpp:
代码文件:
错误:
c++ - 拦截 C++ 隐式复制构造函数,或调用其功能
鉴于:
...其中“东西”可以是任何一组属性。(这个想法是有一个该类实例的计数器)
然后:
将调用自动复制构造函数,因此我会错过计算这个。
有没有办法让该计数器反映自动创建的新实例?如果我实现显式复制构造函数,我将不得不一一分配所有属性。但是,我想要一个浅的、按成员的副本。我不需要执行深层复制,因此实现显式复制构造函数似乎有很多不必要的工作。
c++ - 关于复制构造
如果我使用构造初始化并且它是正确的。但是如果使用“price(orig.price)”会出错,为什么?
c++ - 类复制构造函数和指向成员函数
我有一个大程序,其中包含一些使用指向成员函数的类。一般的代码结构是:
此代码按原样编译。但是,我的问题是:在这种情况下,我是否需要定义复制构造函数和/或析构函数?
例如,我可以定义
但我认为这可以由编译器默认给出。另外,我不确定默认析构函数,因为涉及到一个指针。
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 之后,我只剩下一个错误:
我能做些什么来解决这个问题?
c++ - C++ 的默认复制构造函数本质上是不安全的吗?迭代器从根本上来说也是不安全的吗?
当遵循最佳实践时,我曾经认为 C++ 的对象模型非常健壮。
然而,就在几分钟前,我意识到了我以前从未有过的。
考虑这段代码:
我写过这样的代码。直到今天,我还没有看到它有问题。
但是,再想一想,我意识到这个类非常糟糕:
它的复制构造函数和复制赋值复制了内部的迭代器vector
,这意味着它们仍然会指向旧 set
的!新的毕竟不是真正的副本!
换句话说,即使这个类没有管理任何资源(没有 RAII) ,我也必须手动实现复制构造函数!
这让我感到惊讶。我以前从未遇到过这个问题,我也不知道有什么优雅的方法可以解决它。再想一想,在我看来,默认情况下复制构造是不安全的——事实上,在我看来,默认情况下类不应该是可复制的,因为它们的实例变量之间的任何类型的耦合都有可能呈现默认副本-构造函数无效。
迭代器从根本上来说存储不安全吗?或者,默认情况下类真的应该是不可复制的吗?
下面我能想到的解决方案都是不可取的,因为它们不允许我利用自动生成的复制构造函数:
- 为我编写的每个重要类手动实现一个复制构造函数。这不仅容易出错,而且为一个复杂的类编写起来也很痛苦。
- 永远不要将迭代器存储为成员变量。这似乎受到严重限制。
- 在我编写的所有类上默认禁用复制,除非我能明确证明它们是正确的。这似乎完全违背了 C++ 的设计,该设计对于大多数类型来说都具有值语义,因此是可复制的。
这是一个众所周知的问题吗?如果是,它是否有一个优雅/惯用的解决方案?
c++ - 需要用互斥锁明确定义的复制构造函数
在我的代码中,我没有故意为 Complex 和 Composition 类定义复制构造函数。我希望使用编译器提供给我的复制构造函数
上面的代码编译没有任何问题。
现在我将复杂类更改为以下
当我编译代码时,我得到了错误
我现在通过在 Composition 中定义我自己的复制构造函数和一个空的主体来解决这个问题。
但是,我仍然不确定为什么我必须在一种情况下创建自己的复制构造函数,并且能够通过编译器生成的另一种情况来解决。罪魁祸首当然是互斥体。是创建此问题的互斥锁的不可复制属性还是我缺少的其他东西?
c++ - 记住原来只能管理共享内存的对象
我有一个关于良好 C++ 风格的问题:我想编写一个类“MyClass”,它有一个或一些指针作为成员,并且 MyClass 能够为这些指针分配内存。我想使用隐式给出默认复制构造函数(以及默认赋值操作符)来复制 MyClass 的一个实例,以便只复制指针并且新对象共享初始对象具有的数据分配。
我的想法是禁止复制对象(使用复制构造函数或赋值运算符创建)释放内存(以及为成员指针分配内存)。为了区分复制的对象和原始对象(由构造函数创建),我想使用以下代码:
这个解决方案(使用与this
-pointer 的比较)会是一个好的风格(例如通过按值调用解析对象)还是有风险?当然,我假设原始对象的寿命总是比复制的对象长。
谢谢!