提取操作符覆盖特定的预期模式

时间:2014-04-03 19:33:17

标签: c++

如何覆盖提取运算符,以便为具有特定预期模式的多个变量赋值?如果输入与预期模式不匹配,它应该触发failbit

例如,我想重载Date类的运算符,因此当用户输入格式为dd/mm/yyyy的日期时,overriden方法会拆分该输入并分配日期,月份和年份到三个不同的本地int变量,然后将它们分配给类的属性,也就是int

如何使用istream拆分单个输入?如何检查输入是否遵循模式?

同样非常重要的是,如果输入不正确,如何防止用户陷入无限循环?鉴于程序要求用户在无限循环中输入的情况,只有在构建好对象时才能完成。

1 个答案:

答案 0 :(得分:0)

让我们从基础开始,重载提取运算符。 (注意:提取运算符从流中提取,输入和插入运算符插入到流中,输出。)

class Date
{
  unsigned int m_year;
  public:
    friend std::istream& operator>>(std::istream& inp, Date& d);
};

std::istream& operator>>(std::istream& inp, Date& d)
{
  // Read Date data members here
  inp >> d.m_year;
  return inp; // To allow chaining.
}

有了基础,下一步就是提出一个方案,告诉Date班级使用哪种格式。
这是一个例子:

class Date
{
  unsigned int m_month;
  unsigned int m_day;
  unsigned int m_year;
  public:
     enum Format_Type
     {
        Day_Month_Year,
        Month_Day_Year,
     };
     Format_Type  input_format;
     friend std::istream& operator>>(std::istream& inp, Date& d);
};

std::istream& operator>>(std::istream& inp, Date& d)
{
    switch (input_format)
    {
      case Month_Day_Year:
      {
         char separator;
         inp >> d.m_month >> separator >> d.m_day >> separator >> m_year;
      }
      break;
    }
    return inp;
}

通过允许用户指定格式化字符串,可以使Date类更复杂。但这仍然是读者的练习。