我有一组学生和一个迭代器,找到一个特定的学生,然后我需要改变。问题是,当我去更改指针指向的对象时,它表示对象是const。我不确定为什么会这样,因为我认为我没有明确地让对象保持不变。我对C ++比较陌生,所以我可能会做一些事情来使Student对象意外地生成。
这是主要功能
set<Student> students;
ifstream file(*somefilename*);
while (!file.is_open())
{
cout << filename << endl;
cout << "Could not open file. Enter new filename: ";
cin >> filename;
file.open(filename);
}
while (!file.eof()) {
string temp = "";
string name;
int regNo;
if (file.eof())break;
for (int i = 0; i < 3; i++) {
if (i == 0)
file >> regNo;
else {
file >> temp;
name += temp;
}
}
cout << "For loop done" << endl;
students.insert(Student(name, regNo));
}
file.close();
file.open("ex1/marks.txt");
while(!file.eof()){
int regNo;
string module;
int mark;
file >> regNo;
Student tempStud("",regNo);
file >> module;
file >> mark;
set<Student>::iterator it = students.find(tempStud);
if (it != students.end()) {
**it->addMark(module, mark);**//here's the problem code
}
}
file.close();
for (set<Student>::iterator it = students.begin(); it != students.end(); it++)
cout << *it << endl;
cin.get();}
这是Student类的头文件
public:
Student(const string &name, int regNo);
int getRegNo() const;
void addMark(string& module, float mark);
float getMark(const string &module) const;
float getMin() const;
float getMax() const;
float getAvg() const;
bool operator <(const Student& s2) const;
bool operator >(const Student& s2);
bool operator ==(const Student& s2);
private:
int regNo;
map<string, float> marks; // keys are modules, values are marks in range 0.0 to 100.0
friend ostream& operator<<(ostream &str, const Student &s);
答案 0 :(得分:2)
你没有做任何事情让学生不小心对象const
。
以下是您的问题:(C++ documentation)
设置中的所有迭代器都指向const元素。
换句话说,set
将不允许您通过迭代器修改元素,即使这些元素在技术上不是const
。
那么set
为什么这样定义呢? (source)
集合的元素将按排序顺序排列。如果你被允许 修改元素,然后无法维护此排序顺序。 因此,您无法修改该项目。
您有三种选择之一。
set
除非有一个非常好(且非常具体)的原因你需要使用set
,否则不要。请改用map
。它没有同样的限制。
删除旧元素并插入该元素的“更新”版本。这需要O(1)时间。 (example)
mutable
如果要修改的数据成员不参与对象类型的自然排序,则将它们声明为mutable
。这相当于说它们的值不会改变类的逻辑const
实例的身份。即使在const
对象或迭代器(example)