这是我的测试计划。变量s1包含一个包含用户定义类型对象的向量。我想重载<<运算符很好地打印这个向量,每行一个元素。
#include <iostream>
#include "myclasses.h"
using namespace std;
int main() {
myclass s1;
s1.add_point(7000, 10);
s1.add_point(8000, 11);
s1.add_point(9000, 12);
cout << s1 << endl;
return 0;
}
这是类定义。基本上它只是另一个用户定义对象的数组。我想要&lt;&lt;操作员打印所有条目,每行一个。假设“anotherclass”具有所需的支持方法。
class myclass {
vector<anotherclass> ps;
public:
void add_point(double, double);
friend ostream &operator<<( ostream &out, const myclass &s );
};
void myclass::add_point(double first, double second) {
ps.push_back(anotherclass(first, second));
}
ostream &operator<<( ostream &out, const myclass &s ) {
vector<anotherclass>::iterator itr;
vector<anotherclass> psp=s.ps; // Why do I need this? Why can't I use s.ps.begin() and s.ps.end() in the for loop directly?
for ( itr=psp.begin() ; itr != psp.end() ; ++itr ) {
cout << "(" << itr->get_first() << "," << itr->get_second() << endl;
}
return out;
}
我已经评论了一条我需要添加的行,以便在我的程序中使用它。我不知道为什么需要那条线。有人可以向我解释一下吗?
答案 0 :(得分:4)
iterator
成员类型始终允许您修改引用的对象。因此,您无法从iterator
参数中获取const &
,例如s
。您需要声明局部变量具有类型vector< anotherclass >::const_iterator
。每个容器类都有const_iterator
与iterator
并行。
您的单行修复工作的原因是新构造的vector
不是const
,与它构造的函数参数不同。
在C ++ 11中,您可以使用auto itr = s.ps.begin()
而不是命名迭代器类型。或者只使用for ( auto const &obj : s.ps )
并完全放弃迭代器。
答案 1 :(得分:1)
我的猜测是因为你将s声明为const,所以不允许访问它的迭代器。 当你使用vector psp = s.ps时,你的程序基本上将s.ps复制到一个可修改的新向量psp。