如何在类中使用 out 运算符 = 进行深度复制

how to do deep copy with out operator = in class

本文关键字:运算符 复制 深度 out      更新时间:2023-10-16
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内部? 如果是这样,那么您必须确保字符串的生存期以某种方式传递它。