如何覆盖提取运算符,以便为具有特定预期模式的多个变量赋值?如果输入与预期模式不匹配,它应该触发failbit
。
例如,我想重载Date
类的运算符,因此当用户输入格式为dd/mm/yyyy
的日期时,overriden方法会拆分该输入并分配日期,月份和年份到三个不同的本地int
变量,然后将它们分配给类的属性,也就是int
。
如何使用istream
拆分单个输入?如何检查输入是否遵循模式?
同样非常重要的是,如果输入不正确,如何防止用户陷入无限循环?鉴于程序要求用户在无限循环中输入的情况,只有在构建好对象时才能完成。
答案 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
类更复杂。但这仍然是读者的练习。