0

我正在构建一个简单的程序来“边走边学”,该程序需要几个文本文件并对其进行处理,第一个文本文件的每一行都是关于一个人的信息,并且每一行都有一个对象(学生类型(见下文))被创建并添加到向量中。在 Student 对象中是一个存储学生标记的地图。我在学生类中有一个函数,它在调用时返回地图(或者至少这就是我想要做的)。目前这个功能是:

marksType Student::printMarks(){
    return marks;
}

(其中marksType = std::map<string, float>)和marks是类型的地图marksType

然后在我的主要功能中,我有:

Student a = *qw;
studmarks = a.printMarks();
for (std::map<string, float>::iterator iter = studmarks.begin(); iter != studmarks.end(); iter++){
    cout << "TEST" << endl;
}

其中 qw 是指向学生对象的指针,而 studmarks 是类型map<string, float>

问题是 cout 没有被调用,所以迭代器似乎跳过(但学生对象确实在标记映射中有项目)。

这是完整的学生课程

#include "Student.h"
using namespace std;
typedef std::map<string, float> marksType;

Student::Student(const string &name, int regNo) : Person(name){
    marksType marks;
    this->regNo = regNo;
}

int Student::getRegNo() const{
    return regNo;
}
void Student::addMark(const string& module, float mark){
    pair<marksType::iterator,bool> check;
    check = marks.insert (pair<string,float>(module,mark));
    if (check.second==false){
        marks[module]=mark;
    }
}
float Student::getMark(const string &module) const throw (NoMarkException){
    if (marks.find(module) != marks.end()){
        return marks.find(module)->second;
    }
    else throw NoMarkException();
}
float Student::getAverageMark() const throw (NoMarkException){
    if (!marks.empty()){
        float avgmark = 0;
        for (marksType::const_iterator avgit=marks.begin(); avgit!=marks.end(); ++avgit){
            avgmark = avgmark + avgit->second;
        }
        avgmark = avgmark/marks.size();
        return avgmark;
    }
    else throw NoMarkException();
}
marksType Student::printMarks(){
    return marks;
}

哦,下面是给学生加分的主要功能部分,

for (vector<Student>::iterator it = students.begin(); it != students.end(); ++it){
    Student b = *it;
    if (regno == b.getRegNo()){
        found = true;
        b.addMark(module, mark);
    }
}

我知道这很有效,因为当我使用 getMark 函数时它确实有效。

4

1 回答 1

1

您正在为存储在 vector 中的学生副本“添加标记” students。这些副本中的每一个仅在循环的一次迭代中存在,结果是您根本没有修改向量的元素:

for (vector<Student>::iterator it = students.begin(); it != students.end(); ++it){
    Student b = *it; // b IS A COPY
    if (regno == b.getRegNo()){
        found = true;
        b.addMark(module, mark); // modify local copy of Student
    }
}

要将它们添加到向量的元素中,请使用

for (vector<Student>::iterator it = students.begin(); it != students.end(); ++it){
    if (regno == it->getRegNo()){
        found = true;
        it->addMark(module, mark);
    }
}
于 2013-01-13T14:28:36.127 回答