C ++使用私有变量定义IO成员变量

时间:2015-04-05 08:02:11

标签: c++

我目前正在为我的c ++类介绍工作,我被卡住了,我被告知在任何时候istr失败时将私有变量设置为CIN_ERROR(下面的帖子代码不好)。 / p>

2个问题:

  1. 如何判断istr是否失败?
  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*/
      }
    }
    
  3. 功能定义是:

    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

3 个答案:

答案 0 :(得分:1)

要检查流是否失败,您可以使用fail()成员函数或转换为bool。转换产生true iff。 not fail()

请注意good()fail()不同。如果没有设置任何错误标志,good()会产生true,这尤其包括EOF标志。 fail()仅检查badbit。即,转换为boolgood()不同。

格式化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并且直接对私有变量进行作用显然不起作用。感谢大家的回答!