我目前正在为我的c ++类介绍工作,我被卡住了,我被告知在任何时候istr失败时将私有变量设置为CIN_ERROR(下面的帖子代码不好)。 / p>
2个问题:
如何在定义成员函数时访问私有变量? (我已尝试确定范围,但它说无法访问)。
std::istream& read(std::istream& istr){
if (istr /*not sure how to check if istr failed*/){
Date::_readErrorCode = CIN_FAILED;
/*_readErrorCode is the private variable*/
}
}
功能定义是:
std::istream& read(std::istream& istr); /*it is within the same
class as the rest, not sure if that helped*/
练习要求: 从控制台以下列格式读取日期:YYYY / MM / DD(即2015/03/24)。此功能不会提示任何内容。如果istream(istr)在任何时候都失败,它会将_readErrorCode设置为CIN_FAILED并且不会清除istream对象。
注意:CIN_FAILED只是一个定义值3
答案 0 :(得分:1)
要检查流是否失败,您可以使用fail()
成员函数或转换为bool
。转换产生true
iff。 not fail()
。
请注意good()
与fail()
不同。如果没有设置任何错误标志,good()
会产生true
,这尤其包括EOF标志。 fail()
仅检查badbit
。即,转换为bool
与good()
不同。
格式化readin while( stream >> variable )
的常用习惯用法是转换为bool
,即它正在检查fail()
。
对于学术练习,您可能(或可能不)期望处理流已配置为在失败时抛出异常的情况。在这种情况下,您还需要try ... catch
构造。
仅适用于学术界,因为iostream例外投掷的设计完全不切实际,因此从未使用过:它不是实践中的考虑因素。当遇到这样的野兽时,不是调整你的代码,而是识别负责的程序员并调整那个人。因此,它完全是学术性的,但处理它可能(或可能不)是学术活动所必需的。
关于访问编译器告诉您无法访问的私有变量,有技术解决方案(特别是Johannes Schaub的技巧,完全在普通类型检查规则中工作),但是您需要这样的解决方案的可能性和三只大象一样从天而降,表演阿巴的金钱钱"。或者其他的东西。您更有可能在相关类的成员函数中执行此操作,或者使用该类的相应成员函数,而您根本没有提供任何信息。
答案 1 :(得分:0)
对于输入流,如果指定的文件不存在,操作系统将不创建,输入流变量将包含错误标志。可以使用成员函数fail()
来检查。
fail()提供了一种检查上一次操作状态的方法 输入流。
fail()如果上一次操作失败则返回true,如果失败则返回false 手术很成功。
std::istream& read(std::istream& istr){
if (istr.fail()){
Date::_readErrorCode = CIN_FAILED;
/*_readErrorCode is the private variable*/
}
}
希望我帮助。
答案 2 :(得分:0)
完全是我的错,让其他人无法回答,但我发现我所遗漏的只是一个独家新闻;
std::istream& Date::read(std::istream& istr){
if (istr.fail){
_readErrorCode = CIN_FAILED;
}
}
读取没有被挖到Date类,这就是为什么我没有定义_readErrorCode并且直接对私有变量进行作用显然不起作用。感谢大家的回答!