nahgnez 2020-09-01 10:27 采纳率: 100%
浏览 187
已采纳

没有重复定义,为什么编译器报错error LNK2005?

error LNK2005: xxx已经在xxx.obj中定义

网上搜说是重复定义了全局变量or函数,可是我代码里面好像没有呀

程序是日期计算器 还没有完善

感觉.h和.cpp没有重复定义 很疑惑

类定义内的不是定义是声明吧?为什么也会报错?

谢谢图片说明

Date.h

//日期类定义
#ifndef DATE_H
#define DATE_H
class Date
{
private:
    int year;
    int month;
    int day;
    void plusOne();//加一天
    int daysInThisMonth();//本月日期
    bool isLeap();//判断是否闰年
    bool operator>(Date d);//判断日期先后:定义较晚的日期>较早的日期
    bool operator==(Date d);//判断两日期是否相等
    int getYear() {return year;}
    int getMonth() {return month;}
    int getDay() {return day;}
public:
    Date(int y, int m, int d);//构造函数
    void displayCalendar();//显示当前月历
    int daysFromNow();//计算距当前日期
    int daysFromOneDay(Date d);//计算距某日日期
    void displayYearlyCalendar();//显示当年年历
};
#endif

Date.cpp

//日期类实现
#include<ctime>
#include<iostream>
#include<iomanip>
#include"Date.h"

using namespace std;

//构造函数
Date::Date(int y, int m, int d)
{
    if(y>0)
        year=y;
    else 
    {
        year=2020;
        cout<<"错误年份。已设置为2020。"<<endl;
    }
    if(m>=1&&m<=12)
        month=m;
    else
    {
        month=1;
        cout<<"错误月份。已设置为1。"<<endl;
    }
    if(d>=1&&d<=daysInThisMonth())
        day=d;
    else
    {
        day=1;
        cout<<"错误日期。已设置为1。"<<endl;
    }
}
//判断两日期是否相等
bool Date::operator==(Date d)
{
    if(this->getDay()==d.getDay()
        &&this->getMonth()==d.getMonth()
        &&this->getYear()==d.getYear())
        return true;
    else return false;
}
//判断日期先后:定义较晚的日期>较早的日期
bool Date::operator>(Date d)
{
    if(getYear()>d.getYear())
        return true;
    else if(getYear()!=d.getYear())
        return false;
    else if(getMonth()>d.getMonth())//同年
        return true;
    else if(getMonth()!=d.getMonth())
        return false;
    else if(getDay()>d.getDay())//同月
        return true;
    else return false;
}
//本月日期
int Date::daysInThisMonth()
{
    switch(getMonth())
    {
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        case 2:
            if(isLeap())//二月考虑闰年
                return 29;
            else return 28;
        default:
            return 31;
    }
}
//判断是否闰年
bool Date::isLeap()
{
    int y=getYear();
    if(y % 4 != 0)//不可以被4整除:平年(如2019)
        return false;
    else if(y % 100 != 0)//可以被4整除不可以被100整除:闰年(如2020)
        return true;
    else if(y % 400 != 0)//可以被4和100整除但不能被400整除:平年(如2100)
        return false;
    else return true;//可以被4、100和400整除:闰年(如2000)
}
//加一天
void Date::plusOne()
{
    if(getDay()!=daysInThisMonth())//不是当月最后一天
        day++;
    else if(getMonth()!=12)//是当月最后一天且月份不是12月:日期归一,月份增一
    {
        month++;
        day=1;
    }
    else//是12月31日:日期、月份归一,年份加一
    {
        year++;
        month=1;
        day=1;
    }
}
//计算距某日日期
int Date::daysFromOneDay(Date d)
{
    int dif;
    if((*this)==d) return 0;//同天
    if((*this)>d)//在后
    {
        for(dif=0;!((*this)==d);dif++)
            d.plusOne();
        return dif;
    }
    else//在前
    {
        //Date dd(this->getYear(),this->getMonth(),this->getDay());
        Date dd((*this));
        for(dif=0;!(dd==d);dif++)
            dd.plusOne();
        return -dif;
    }
}
//计算距当前日期
int Date::daysFromNow()
{
    time_t now=time(0);
    tm* ltm=localtime(&now);
    int y=1900+ltm->tm_year;
    int m=1+ltm->tm_mon;
    int d=ltm->tm_mday;
    Date today(y,m,d);
    return daysFromOneDay(today);
}
//显示当前月历
void Date::displayCalendar()
{
    Date std(2020,1,1);
    int week=3;
    if((*this)>std)
    {
        int dif=this->daysFromOneDay(std);
        for(int i=0;i<dif;i++)
        {
            if(week<7)
                week++;
            else week=1;
        }
    }
    else
    {
        int dif=this->daysFromOneDay(std);
        for(int i=0;i>dif;i--)
        {
            if(week>1)
                week--;
            else week=7;
        }
    }
    cout<<getYear()<<"年"<<getMonth()<<"月"<<endl;
    cout<<"日  一  二  三  四  五  六"<<endl;
    int space;
    if(week==7)
        space=0;
    else space=4*week;
    for(int i=0;i<space;i++)
        cout<<" ";
    for(int i=getDay();i<=daysInThisMonth();i++)
    {
        cout<<setw(2)<<i;
        if(week==6)
        {
            cout<<endl;
            week++;
        }
        else if(week==7)
            week=1;
        else week++;
    }
}
//显示当年年历
void Date::displayYearlyCalendar()
{

}

主函数.cpp

#include<iostream>
#include<cstdlib>
#include"Date.cpp"

using namespace std;

int main()
{
    cout<<"欢迎使用日期计算器。"<<endl<<endl;
    cout<<"输入数字完成相应功能:"<<endl;
    cout<<"1.显示日历"<<endl;
    cout<<"2.计算今日与某日间距"<<endl;
    cout<<"3.计算任意两日期间距"<<endl;
    cout<<"4.生成年历并保存"<<endl<<endl;
    cout<<"输入0可退出"<<endl;

    int flag;
    cin>>flag;

    while (flag)
    {
        switch (flag)
        {
        case 1:
        {
            system("cls");
            cout << "请以格式“年 月 日”输入日期,中间以空格隔开:" << endl;
            int y, m, d;
            cin >> y >> m >> d;
            Date day(y, m, d);
            day.displayCalendar();
            break;
        }
        case 2:
        {
            system("cls");
            cout << "请以格式“年 月 日”输入日期,中间以空格隔开:" << endl;
            int y, m, d;
            cin >> y >> m >> d;
            Date day(y, m, d);
            cout << "今日距该日" << day.daysFromNow() << "日" << endl;
            cout << "(该日晚于今日则为正,该日早于今日则为负)" << endl;
            break;
        }
        case 3:
        {
            system("cls");
            cout << "请以格式“年 月 日”输入日期1,中间以空格隔开:" << endl;
            int y1, m1, d1;
            cin >> y1 >> m1 >> d1;
            Date day1(y1, m1, d1);
            cout << "请以格式“年 月 日”输入日期2,中间以空格隔开:" << endl;
            int y2, m2, d2;
            cin >> y2 >> m2 >> d2;
            Date day2(y2, m2, d2);
            cout << "日期2距日期1" << day2.daysFromOneDay(day1) << "日" << endl;
            cout << "(日2晚于日1则为正,日2早于日1则为负)" << endl;
            break;
        }
        case 4:
        {
            system("cls");
            cout << "请以格式“年 月 日”输入日期,中间以空格隔开:" << endl;
            int y, m, d;
            cin >> y >> m >> d;
            Date day(y, m, d);
            day.displayYearlyCalendar();
            cout << "年历已保存。" << endl;
            break;
        }
        default:
            break;
        }
        if (flag!=1&&flag!=2&&flag!=3&&flag!=4)
            break;
        cout << "输入数字完成相应功能:" << endl;
        cout << "1.显示日历" << endl;
        cout << "2.计算今日与某日间距" << endl;
        cout << "3.计算任意两日期间距" << endl;
        cout << "4.生成年历并保存" << endl << endl;
        cout << "输入0可退出" << endl;
        cin >> flag;
    }
    cout << "\n感谢使用。\n" << endl;
    return 0;
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2020-09-01 10:50
    关注
    主程序
    #include"Date.cpp"
    ->
    #include"Date.h"
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作