C++类与对象代码中如何通过cin实现用户日期数据输入
C++ Date类添加用户输入功能实现方案
报错核心原因
- 原始Date类仅提供了带3个参数的构造函数,没有定义无参默认构造函数,如果你直接声明
Date date1;再尝试用cin读入赋值,会触发编译错误,编译器找不到匹配的构造函数。 - 原始类的setter方法存在逻辑漏洞,比如
setMonth仅判断了<=12,没有判断>=1,输入负数也会错误赋值;setDay没有适配不同月份的天数差异,仅判断1-31范围。
正确实现代码
以下是添加了用户输入功能、同时修复了setter逻辑缺陷的完整代码:
#include<iostream> using namespace std; class Date { int Day; int Month; int Year; public: void setDay(int day) { // 简化判断,可根据需求补充不同月份、闰年2月的天数校验 if(day>=1 && day<=31) Day = day; else{ cout << "输入的日期不合法,已默认设为1\n"; Day = 1; } } int getDay() { return Day; } void setMonth(int month) { if(month >=1 && month <= 12) Month = month; else{ cout << "输入的月份不合法,已默认设为1\n"; Month = 1; } } int getMonth() { return Month; } void setYear(int year) { if(year >=1111) Year = year; else{ cout << "输入的年份不合法,已默认设为1111\n"; Year = 1111; } } int getYear() { return Year; } void DisplayDate() { cout << "Days: " << Day << " \n"; cout << "Month: " << Month << " \n"; cout << "Year: " << Year << " \n"; } // 新增无参默认构造函数,支持先创建对象再赋值 Date() { Day = 1; Month = 1; Year = 1111; } // 原有带参构造函数保留,复用setter做校验 Date(int day, int month, int year) { setDay(day); setMonth(month); setYear(year); } void Birthday() { cout << "Your Birthday is " << Day << " / " << Month << " / " << Year << "\n"; } }; int main() { int d, m, y; cout << "请输入日、月、年,用空格分隔:"; cin >> d >> m >> y; // 方法1:输入完成后直接用带参构造函数创建对象 Date date1 = Date(d, m, y); date1.DisplayDate(); date1.Birthday(); // 方法2:用默认构造函数创建对象后,调用setter赋值(二选一即可) /* Date date2; date2.setDay(d); date2.setMonth(m); date2.setYear(y); date2.DisplayDate(); date2.Birthday(); */ return 0; }
实现说明
- 新增了无参默认构造函数,支持两种创建对象的方式,适配不同的使用场景
- 修复了原有setter的逻辑漏洞,新增非法输入的提示和默认值处理,避免脏数据
- 用户输入的数值会先传入setter做校验,再赋值给类成员变量,符合封装规范
内容的提问来源于stack exchange,提问作者Bill Blankson
相关产品推荐
相关产品推荐

