You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:36:03