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&amp; st: studVect) 天哪,我有一种感觉,它是如此明显。谢谢! 另外,在addMark 中,为什么要使用迭代器而不是仅仅设置它? marks[module] = mark; 【参考方案1】:

您正在使用学生记录的副本。

改变

for (Student st: studVect)

for (Student &st: studVect)

【讨论】:

以上是关于C ++ - 类方法更改成员变量,但不在main中的主要内容,如果未能解决你的问题,请参考以下文章

static关键字

java复习路4

在另一个类c ++中调用成员函数

子类和继承

java中啥是友好变量和友好方法

关于java子类继承以及final问题总结