保留矢量值的副本,然后将其覆盖
Keeping a copy of a vector value, which will then be over-written
我有一些代码,如下所示:
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
设置为原始对象的副本(通过其复制构造函数)。此副本与矢量没有连接,因此不会受到修改矢量的影响。
如果我理解正确,以下步骤发生在您的函数中
- 你用 vector[0] 做了一些修改它的事情。
- 重新分配整个向量。
在步骤 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
}
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 使用ios:ate写入到流会覆盖现有文件
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- 我可以重新分配/覆盖std::字符串吗
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- C++:如何读取分离变量,然后读取向量
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 使用fstream在文件中覆盖一些文本,然后删除文件的其余部分
- 我可以克隆C++对象的字节,覆盖原始字节,然后将这些字节复制回来吗?
- 保留矢量值的副本,然后将其覆盖
- 用管理器注册一个类,然后调用子类被覆盖的方法