C ++指针指向从未成为const的const对象

时间:2017-01-03 02:56:25

标签: c++ pointers const

我有一组学生和一个迭代器,找到一个特定的学生,然后我需要改变。问题是,当我去更改指针指向的对象时,它表示对象是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);

1 个答案:

答案 0 :(得分:2)

你没有做任何事情让学生不小心对象const

问题

以下是您的问题:(C++ documentation

  

设置中的所有迭代器都指向const元素。

换句话说,set将不允许您通过迭代器修改元素,即使这些元素在技术上不是const

那么set为什么这样定义呢? (source

  

集合的元素将按排序顺序排列。如果你被允许   修改元素,然后无法维护此排序顺序。   因此,您无法修改该项目。

解决方案

您有三种选择之一。

1)不要使用set

除非有一个非常好(且非常具体)的原因你需要使用set,否则不要。请改用map。它没有同样的限制。

2)删除并插入

删除旧元素并插入该元素的“更新”版本。这需要O(1)时间。 (example

3)使用mutable

如果要修改的数据成员不参与对象类型的自然排序,则将它们声明为mutable。这相当于说它们的值不会改变类的逻辑const实例的身份。即使在const对象或迭代器(example

中,这也可以让您改变这些数据成员