【发布时间】:2010-08-12 13:14:11
【问题描述】:
我正在学习 C++,但无法解决这个问题:
我有一个简单的 A 类
class A {
private:
int ival;
float fval;
public:
A(int i = 0, float f = 0.0) : ival(i), fval(f) { }
~A(){ }
void show() const {
cout << ival << " : " << fval << "\n";
}
void setVal(int i) {
ival = i;
}
//const getters for both ival and fval
//used for the default "lesser"
friend bool operator<(const A& val1, const A& val2) {
return val1.ival < val2.ival ? true : false;;
}
}
然后我有一个常规的set<A> myset,它在循环中被insert(A(2, 2.2)); 填充。
迭代获取所有值不是问题,但我想在此迭代中修改值:
for(set<A>::iterator iter = set3.begin(); iter != set3.end(); iter++) {
iter->setVal(1);
}
我认为这应该是可行的,就像您在 Java 中的 foreach 循环中那样。编译时我得到error: passing ‘const A’ as ‘this’ argument of ‘void A::setVal(int)’ discards qualifiers。
查看 STL 集的来源,我发现 begin() 只能作为 const 方法使用,我认为这可能是问题所在。在 setVal() 方法上乱用 const 总是会出现同样的错误,而且没有多大意义,因为我想修改 A 的值。
这是用循环更改一堆A 的值的错误方法吗?
【问题讨论】:
-
+1 因为看起来你真的是自己先搜索的,当你学到新东西时这总是一件好事。
-
请注意
val1.ival < val2.ival ? true : false与val1.ival < val2.ival相同。 -
@Pedro:谢谢,既然你这么说了,这很明显,但我自己看不到。
标签: c++ stl iterator constants