0
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它时打印垃圾值?

这里的重点是我正在使用库,我无法更改库以在数据中添加 operator =。

为什么我面临这个问题以及如何解决它?(我用谷歌搜索了它,提到我必须进行深度复制,但我不知道如何为矢量制作它。

4

4 回答 4

3

使用std::string

std::string objName;   

现在它将完成深拷贝的工作。无需再担心了。

此外,总的来说,std::string它很棒,你会喜欢它的。在需要时使用它 char*const char*(作为一般规则)。

于 2012-07-16T12:55:02.387 回答
0

首先,对于您展示的那段代码,浅拷贝应该可以工作。只要objName指向字符串文字,应该没有问题。

如果objName确实开始指向其他东西,那么您可能需要特殊的函数来管理它,不仅用于分配,还用于创建等。此时,您将需要一个包装类。但首先,我会确保您确实需要它:因为您说它Data在一个您无法更改的外部库中,所以它也可能对此有一些限制。(库是否在内部复制Data ?如果是这样,那么您必须以某种方式确保传递它的字符串的生命周期。)

于 2012-07-16T13:20:17.923 回答
0

如果您可以更改Property为使用 astd::string而不是 aconst char*一切都会奏效。

如果你不能,包装Data在一个类中,你可以为它提供一个复制 ctor/assign 运算符并存储一个向量。

于 2012-07-16T12:55:56.110 回答
0

You can create a new class DataRef which embeds Data and implement the rule-of-three in that on behalf of the Data/Property. Then use DataRef in the vector.

于 2012-07-16T12:57:48.667 回答