我正在构建一个简单的程序来“随时随地学习”,这个程序需要几个文本文件和处理器,第一个文本文件的每一行是关于一个人的信息,并且对于每一行一个对象(类型学生(见下文))已创建并添加到矢量中。 在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是指向学生对象的指针,而标记的类型为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函数时,它确实有效。
答案 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);
}
}