我有一个学生课程,存储学生的姓名和注册号码。 Student类的私人成员之一是存储学生模块代码(字符串)的地图,以及模块的标记(浮动)。
该课程有一个' addMark'获取模块代码和该模块标记的函数。如果模块已存在于地图中,则标记将被覆盖。否则,它将被插入地图中。
void Student::addMark(const string &module, float mark)
{
map<string, float>::iterator iter = marks.find(module);
if (iter != marks.end()){marks[module] = mark;}
else{marks.insert({module, mark});}
}
我已经检查了,这似乎在该功能内部起作用。
在main函数中,我有一个向量markLine,它将行的每个标记存储在包含标记的文本文件中。第一个标记(markLine.at(0))是注册号,第二个标记是模块代码,第三个标记是标记。因此,对于一行,矢量可能如下所示:
markLine = {10105, "CE101", 78.5};
无论如何,在阅读一行并存储每个令牌后,需要为正确的学生存储模块标记,因此我使用for循环遍历所有学生并查看他们的注册号是否匹配。如果是,则添加标记:
for (Student st: studVect)
{
if (st.getRegNo() == markLine.at(0))
{
st.addMark(markLine.at(1), markLine.at(2));
}
}
但是当我事后检查一下学生的分数是否已经改变时,他们却没有。
我已经搜索了很多东西,发现了一些与我的问题非常相似的问题,我觉得这与引用有关,并且创建了一个标记副本。但是,我并不确定 我需要使用引用。如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:1)
您正在使用学生记录的副本。
更改
for (Student st: studVect)
到
for (Student &st: studVect)