C ++从对象传递地图

时间:2013-01-13 13:48:38

标签: c++

我正在构建一个简单的程序来“随时随地学习”,这个程序需要几个文本文件和处理器,第一个文本文件的每一行是关于一个人的信息,并且对于每一行一个对象(类型学生(见下文))已创建并添加到矢量中。 在Student对象中是一个存储学生标记的地图。 我在学生班中有一个函数,它在调用时返回地图(或者至少是我试图做的事情)。 目前这个功能是:

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

marksType = std::map<string, float>marksmarksType类型的地图。

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

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

其中qw是指向学生对象的指针,而标记的类型为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函数时,它确实有效。

1 个答案:

答案 0 :(得分:1)

您正在向存储在向量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);
    }
}