保留矢量值的副本,然后将其覆盖

Keeping a copy of a vector value, which will then be over-written

本文关键字:然后 覆盖 副本 保留      更新时间:2023-10-16

我有一些代码,如下所示:

MyClass* a = new MyClass();
vector[0] = *a;
MyClass KeepCopy = vector[0];
//
//
vector gets changed
//
//
return KeepCopy

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

编辑3:好的,这就是正在发生的事情。KeepCopy 被分配给 vector[0],然后在代码中我向 vector[0] 做一些事情。我在想 KeepCopy 仍然指向 vector[0] 的一个版本,但似乎 KeepCopy 只包含进行赋值时的值的副本。

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

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

如果是这种情况,您应该实现一个适当的复制构造函数,该构造函数创建原始副本的深层副本(而不是盲目复制指针值的默认浅拷贝)

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

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

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

  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
}