如何在类中使用 out 运算符 = 进行深度复制
how to do deep copy with out operator = in class
struct Property
{
int objID;
const char* objName;
};
struct Data
{
Property propertyRef;
}
std::vector<Data> items;
这是我分配数据的函数之一,如下所示
Data d1;
d1.propertyRef.objID = 1;
d1.propertyRef.objName = "MyObj";
//... I am some logic in between and passing this d2 which is mentioned below to another thread in argument
Data d2 = d1;
问题是当我打印d2.propertyRef.objName
时,它是打印垃圾价值?
这里的重点是我正在使用库,我无法更改库以在数据中添加运算符 =。
为什么我面临这个问题以及如何解决它?(我用谷歌搜索了一下,提到我必须深度复制,我不确定如何为矢量进行 d。
使用 std::string
:
std::string objName;
现在它将完成深拷贝的工作。无需再担心了。
此外,总的来说,std::string
很棒,你会喜欢它。当您需要char*
或const char*
时使用它(作为一般规则(。
如果您可以将Property
更改为使用std::string
而不是const char*
则一切正常。
如果不能,请将Data
包装在一个类中,您可以为其提供一个复制 ctor/assign 运算符并存储该运算符的向量。
您可以创建一个嵌入数据的新类 DataRef 并代表 Data/Property 实现三法则。然后在向量中使用 DataRef。
首先,对于您显示的代码位,浅拷贝应该可以工作。 只要由于objName
指向字符串文本,因此应该没有问题。
如果objName
确实开始指向其他事物,那么您可能需要管理它的特殊功能,不仅用于分配,还用于创作等 此时,您将需要一个包装类。 但首先,我会确保你确实需要它:因为你说Data
在您无法更改的外部库,它可能有一些对此也有限制。 (库是否复制Data
内部? 如果是这样,那么您必须确保字符串的生存期以某种方式传递它。
相关文章:
- 复制构造函数、赋值运算符C++
- 为用户定义的类正确调用复制构造函数/赋值运算符
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 强制复制分配超过移动分配运算符
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 编译器调用复制运算符而不是移动运算符
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 在 c++ 中使用深度复制的运算符重载
- 使用赋值运算符复制 std::vector
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 复制构造函数和赋值运算符的值类实现
- 冲突的 CLANG"虚拟 dtor"和"已弃用的复制运算符"警告
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员
- 使用赋值运算符复制两个类中的数组时出现编译器错误
- 用if-statement移动构造函数,但使用三元运算符复制构造函数
- 赋值运算符复制数组中除可用空间之外的所有内容
- 使用"="运算符复制字符* 内容
- 仅使用按位运算符复制 for 循环的函数