我的问题是怎么做,
while(cin>>x)
{
//code
}
的工作。或者更具体地说,那个代码会停止循环?
从文档here,它看起来像>>运算符返回&istream
。这是否意味着如果读取失败或命中文件末尾它不仅设置eofbit,failbit或badbit而且还返回null?这真的没有意义,所以我怀疑是这样。
是否存在某种对eofbit的隐式检查?
我问,因为我希望用类似的2个类来实现类似的东西,
class B
{
//variables and methods
}
class A
{
//Variables and methods
//Container of B objects. ex. B[] or vector<B> or Map<key,B>
&A >> (B b);
}
int main()
{
A a;
B b;
while( a >> b)
{
//Code
}
}
注意:我不打算继承istream
,除非这是让这项工作的魔力来自哪里。这样做的原因是我希望保持类及其依赖关系尽可能小。如果我从istream
继承,我将收到所有公共和受保护的内容,而我不是要创建一个istream
类似的对象。我只想复制一个真的好的部分。
编辑:我正在使用Visual Studio 2010(这变得非常痛苦)我将需要一些兼容它的C ++ 03 + C ++的实现11。
答案 0 :(得分:5)
从这里的文档看起来像&gt;&gt;运算符返回&amp; istream。这是否意味着如果读取失败或命中文件末尾它不仅设置eofbit,failbit或badbit而且还返回null?
不,返回对流对象的引用,但将设置内部标志。在测试这些标志后,对operator>>
的后续调用将失败。
是否存在某种对eofbit的隐式检查?
不确定问题是什么。流不会尝试预先查找下一个请求是否会失败,而是仅在一个操作失败时设置该标志,因为它命中了EOF。每次调用operator>>
都将首先测试流的状态,并且只有在流状况良好时才会继续。
while(cin>>x)
如何运作?
存在从流对象到布尔值的隐式转换。如果流状况良好,则转换结果为true
,否则为false
。
答案 1 :(得分:4)
现在你能写一个例子,说明如何用上述内容做到这一点吗?
像这样:
// UNTESTED
class B
{
//variables and methods
}
class A
{
bool still_good;
//Variables and methods
//Container of B objects. ex. B[] or vector<B> or Map<key,B>
A& operator>>(B& b) {
try_to_fill_b();
if(fail) still_good = false;
return *this;
}
explicit operator bool() { return still_good; }
}
int main()
{
A a;
B b;
while( a >> b)
{
//Code
}
}