【发布时间】:2018-01-13 19:35:31
【问题描述】:
我有一个学生类,其中存储了学生的姓名和注册号。 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});}
}
我已经检查过了,这似乎在该函数中有效。
在主函数中,我有一个向量 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));
}
}
但是当我事后检查某个学生的分数是否发生了变化时,他们没有。
我在谷歌上搜索了很多,发现一些问题与我的非常相似,我觉得这与参考有关,并且正在创建标记的副本。但是,我不确定 where 究竟需要使用参考。如果有人能指出我正确的方向,我将不胜感激。
【问题讨论】:
-
for (Student st: studVect)在迭代时创建每个Student的副本。改为for (Student& st: studVect) -
天哪,我有一种感觉,它是如此明显。谢谢!
-
另外,在
addMark中,为什么要使用迭代器而不是仅仅设置它?marks[module] = mark;
标签: c++ pass-by-reference