C ++ - 类方法更改成员变量,但不在main中
Posted
技术标签:
【中文标题】C ++ - 类方法更改成员变量,但不在main中【英文标题】:C++ - Class method changes member variable, but not in main 【发布时间】: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;
elsemarks.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;
【参考方案1】:
您正在使用学生记录的副本。
改变
for (Student st: studVect)
到
for (Student &st: studVect)
【讨论】:
以上是关于C ++ - 类方法更改成员变量,但不在main中的主要内容,如果未能解决你的问题,请参考以下文章