2014-04-03 24 views
0

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

举例来说,我想重载运营商的Date类,因此当用户以下格式dd/mm/yyyy输入一个日期的覆盖方法将日,月和年拆分输入,并分配到三个不同的地方int变量,然后将它们分配给该类的属性,这也将是int

如何使用istream分割单个输入?我怎样才能检查输入遵循模式?

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

回答

0

让我们从基础开始,重载提取运算符。 (注意:从流,输入提取算子的提取物,和插入操作者可以插入1个流,输出)

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类更复杂。但这只是对读者的一个练习。