0

私は「学習しながら学習する」ための簡単なプログラムを作成しています。このプログラムは、いくつかのテキストファイルを受け取り、それらを処理します。最初のテキストファイルの各行は人に関する情報であり、各行にはオブジェクト(タイプ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関数を使用すると機能するため、これが機能することはわかっています。

4

1 に答える 1

1

vector に保存されている学生のコピーに「マークを追加」していますstudents。これらの各コピーは、ループの 1 回の反復中にのみ存続し、その結果、ベクトルの要素をまったく変更していません。

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 に答える