我在使用while(cin)和struct时遇到了麻烦。有人请让我明白这个问题吗?我不知道是否有这样的帖子。如果是请原谅我和我的坏英语。
struct ThiSinh{
string m_HT;
float m_H;
};
我重载运算符>>为它
bool operator >> (istream& is, ThiSinh &ts){
getline(is, ts.m_HT);
is >> ts.m_H;
is.ignore();
return ???;
}
因为while(cin>> ThiSinh)需要bool类型,所以我不知道它应该返回什么数字或数据。以及当我按ctrl + Z时如何打破while循环。 我也试过
while(cin){
ThiSinh ts;
cin >> ts;
}
它有效,但我不想得到那些错误的数据。所以有人请帮助我。提前谢谢。
答案 0 :(得分:3)
您的operator >>
会返回bool
,这对于流提取运算符来说非常不寻常,并且在大多数流式上下文中使其无法使用。期望这些运营商返回对其运营的流的引用:
istream& operator >> (istream& is, ThiSinh &ts){
getline(is, ts.m_HT);
is >> ts.m_H;
is.ignore();
return is;
}
这是多个exrtactions实际工作的方式:
std::cin >> a >> b >> c;
实际上,首先执行auto &tmp = operator>>(std::cin, a)
,然后调用operator>>(tmp, b)
,依此类推。
可以在条件中使用流(以及扩展,流提取操作)的原因是std::istream
(和std::ostream
)定义到bool
的转换(返回{{ 1}} iff流处于无错误状态);然后由条件调用该转换。
换句话说,这个:
true
实际上变成了这个:
while (std::cin >> ts)
并且可以进行投射,因为while (static_cast<bool>(operator>>(std::cin, ts)))
返回operator>>
而std::istream&
定义了转化为std::istream
。