为啥最后一个推回对象的字段到向量中会转移到向量的其他对象? [关闭]
Posted
技术标签:
【中文标题】为啥最后一个推回对象的字段到向量中会转移到向量的其他对象? [关闭]【英文标题】:Why do the fields of the last pushed back object into a vector transfer to the other objects of the vector? [closed]为什么最后一个推回对象的字段到向量中会转移到向量的其他对象? [关闭] 【发布时间】:2019-12-25 12:27:29 【问题描述】:我的代码有点卡住,无法找出问题所在。我希望你能帮助我。
我有 4 个课程: - 类 BasicModul:除其他外,它有一个名为 modulName 的字段。 - 类 DrawingSettings:此时不相关 - 类 ModulRepresentation:由 BasicModul 对象和 DrawingSettings 对象构成。 - 类 ModulesContainer:它有一个字段是 std::vector 。它在代码中使用的对象是“容器”。
我的问题是,显然当将新的 ModulRepresentation 推回 ModulesContainer(ModulRepresentation 的向量)时,似乎最后创建并推回的 ModulRepresentation 的字段被传递到先前创建并推回的 ModulRepresentation 的字段中在模块容器中。 ModulContainer“容器”在代码的开头被初始化。我正在使用 ImGui 创建 GUI。
错在哪里?我以前有一个更简单的代码,它的功能基本相同,但封装较少(例如,std::vector 直接在主代码中定义等等)并且它按预期工作。 modulCounter 变量从值 0 开始。我认为类的函数名称应该足够具有描述性,但如果您需要更多信息,请告诉我。
提前致谢!
if (ImGui::Button("MODUL")) // Buttons return true when clicked
modulCounter++;
int auxiliar=modulCounter*10;
std::string saux = std::to_string(auxiliar);
std::cout << "Here 1" << std::endl;
BasicModul modAux(saux);
ModulDrawingSettings modDrawSet;
ModulRepresentation modRep(modAux, modDrawSet);
container.push_backModul(modRep);
std::cout << saux << std::endl;
std::cout << "Vector Size/Capacity: " << container.modulesContainerSize() << "/" << container.modulesContainerCapacity() << std::endl;
std::cout << "Here 2" << std::endl;
for (int j=0; j<container.modulesContainerSize(); j++)
BasicModul modAuxiliar = container.getModulRepresentation(j).getBasicModul();
std::cout << "\n" << std::endl;
std::cout << "Position in the container" << j << std::endl;
std::cout << container.getPointerToModulRepresentation(j) << std::endl;
std::cout << "name of the modul" << container.getModulRepresentation(j).getBasicModul().getModulName() << std::endl;
std::cout << "Here 3" << std::endl;
这是输出:
Here 1
Address of the original modul object: 0x7ffd6ba4cf30
10
Vector Size/Capacity: 1/1
name of the last modul passed: 10
Here 2
Position in the container0
0x5595967583c0
name of the modul10
Here 3
Here 1
Address of the original modul object: 0x7ffd6ba4cf30
20
Vector Size/Capacity: 2/2
name of the last modul passed: 20
Here 2
Position in the container0
0x559596b4c600
name of the modul20
Position in the container1
0x559596b4c720
name of the modul20
Here 3
Here 1
Address of the original modul object: 0x7ffd6ba4cf30
30
Vector Size/Capacity: 3/4
name of the last modul passed: 30
Here 2
Position in the container0
0x559596bb99b0
name of the modul30
Position in the container1
0x559596bb9ad0
name of the modul30
Position in the container2
0x559596bb9bf0
name of the modul30
Here 3
Here 1
Address of the original modul object: 0x7ffd6ba4cf30
40
Vector Size/Capacity: 4/4
name of the last modul passed: 40
Here 2
Position in the container0
0x559596bb99b0
name of the modul40
Position in the container1
0x559596bb9ad0
name of the modul40
Position in the container2
0x559596bb9bf0
name of the modul40
Position in the container3
0x559596bb9d10
name of the modul40
Here 3
【问题讨论】:
了解深拷贝与浅拷贝。 该错误存在于一个或多个涉及的类中,您没有尽可能多地复制。 @stark 谢谢你的回答。我已经了解了这些概念(深拷贝与浅拷贝),虽然我想我知道你想到的是哪种问题,但我无法在我创建的更简单的示例中重现它。你能解释一下你的意思吗?你认为我需要一个非默认的复制构造函数,尽管我没有处理动态分配的元素和指针吗?我编辑了一些输出信息以包含其他内容,我认为这可能会有所帮助。提前谢谢!BasicModul
、ModulDrawingSettings
或 ModulRepresentation
或它们作为成员的其他类,包含指针或引用成员或不正确的用户定义的复制/移动构造函数或赋值运算符跨度>
en.cppreference.com/w/cpp/language/rule_of_three
【参考方案1】:
所以我终于发现了错误。正如@stark 和后来的@M.M 所建议的那样,问题是一个字段是一个指针,因此一直指向同一个地址,该地址是用向量中最后一个推回的对象更新的。由于它是一个指针,因此浅拷贝(在推回向量期间发生)是不够的。我只是通过使该字段成为我最初打算的“正常”类型而不是指针来修复它。
感谢您的回答!
【讨论】:
以上是关于为啥最后一个推回对象的字段到向量中会转移到向量的其他对象? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章