解决: 根据关于具有固定大小的两个响应,我确实有一个用于数组大小的私有var。
简单解决方案:while(i< rhs.size)或for循环
我从这段代码中获得了一个无限循环。主要是我输入1 2 3 4 5
问题是即使在读完所有5个int后,系统仍在等待更多输入。如果我输入另一个int,它将再次进入循环。
template <typename T>
istream& operator>> <>(istream& in, MyArray<T>& rhs)
{
int i = 0;
while(!in.eof()) //I tried: while(in >> rhs.theArray[i]) as well, no go
{
in >> rhs.theArray[i];
i++;
}
return in;
}
答案 0 :(得分:0)
可以肯定地说,你永远不应该写while(!in.eof()) {
。
在读取尝试之后
T x;
while(in >> x) {
rhs.theArray[i] = x;
++i;
}
这样做是尝试从流中提取项目。如果在提取之后流仍处于“良好”状态,则执行循环体,否则,不变量失败并且循环终止。
在最后,这使得循环条件“我可以成功获得另一个项目......”
这是一种更好的方法,因为它还可以处理除EOF之外的条件。
答案 1 :(得分:0)
由于您的rhs.Array
很可能是一个固定大小(除非您正在进行operator[]
的某些花哨重载以正确扩展底层内存数组),您应该只接受输入以获得最大数量的空格是你的数组的大小,而不是使用理论上会导致缓冲区溢出的while循环。
一般情况下,我会遵循以下两条规则从命令行获取可变数量的输入:
istream::peak()
之类的内容提早退出,请检查转义字符...请记住,必须使用CTRL-D命令行显式发送EOF
命令行-line从文件中重定向等....转义字符的更好选择是行尾字符,如换行符,回车符(Windows)等。答案 2 :(得分:0)
你应该有一个int var命名大小来存储固定大小,一旦你这样做,你可以读入int i = 0;我&lt;大小,这应该可以解决你的问题。