1

我有一些代码如下:

MyClass* a = new MyClass();
vector[0] = *a;

MyClass KeepCopy = vector[0];

//
//
vector gets changed
//
//

return KeepCopy

现在向量然后去做很多事情并被覆盖。但是,我希望在函数结束时返回 KeepCopy 的值。但是,因为 vector[0] 没有指向其他东西,所以我认为我返回了错误的数据。

EDIT3:好的,这就是正在发生的事情。KeepCopy 被分配给向量 [0],然后在代码中我对向量 [0] 进行处理。我在想 KeepCopy 仍然指向向量 [0] 的一个版本,但似乎 KeepCopy 仅包含在分配时值的副本。

稍后我将向量分配给另一个向量对象(我一次读取两行文本文件,向量包含一行,另一个向量对象包含第二行)。如何确保 KeepCopy 指向原始 vector[0] 元素(在我开始解析文本文件中的每一行,重新分配向量之前)?

4

4 回答 4

1

为 MyClass 实现一个复制构造函数并复制该对象。不是指针。

于 2012-05-27T16:15:22.093 回答
1

当您按值(而不是按指针/引用)存储对象时,更改vector[0]不会反映在 中,除非您在实例KeepCopy中共享指向同一包含对象的指针MyClass

如果是这种情况,您应该实现一个正确的复制构造函数,该构造函数对原始副本进行深度复制(而不是默认的浅拷贝,它只是盲目地复制指针的值)

于 2012-05-27T16:16:53.227 回答
1

就像您所做的那样:MyClass KeepCopy = vector[0];将设置KeepCopy为原始对象的副本(通过其复制构造函数)。此副本与向量无关,因此不会受到修改向量的影响。

于 2012-05-27T16:17:12.560 回答
0

如果我理解正确,您的函数中会发生以下步骤

  1. 你用 vector[0] 做一些修改它的事情。
  2. 您重新分配整个向量。

在第 1 步之后但在第 2 步之前的 vector[0] 的状态是您想要返回的东西。所以这就是你的代码中应该制作副本的地方。

MyClass foo()
{
    //
    // some stuff
    //

    MyClass* a = new MyClass();
    vector[0] = *a;

    //
    // vector[0] gets modified
    //

    // you want vector[0]'s value here, so this is where you should create the copy
    MyClass KeepCopy = vector[0];


    //
    // Whole vector gets reassigned
    //

    return KeepCopy
}
于 2012-05-27T16:52:55.300 回答