私は「学習しながら学習する」ための簡単なプログラムを作成しています。このプログラムは、いくつかのテキストファイルを受け取り、それらを処理します。最初のテキストファイルの各行は人に関する情報であり、各行にはオブジェクト(タイプStudent(以下を参照))が作成され、ベクターに追加されます。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が呼び出されないため、イテレータがスキップしているように見えることです(ただし、studentオブジェクトにはマークマップにアイテムがあります)。
ここに完全な学生クラスがあります
#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関数を使用すると機能するため、これが機能することはわかっています。