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

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

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

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

感觉.h[ v t - ) c和.cpp没有重复定义 很疑惑

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

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

Date.h

//日期类定义
#ifndef DATE_H
#define DATE_H
class Date
{
private:
int year;
int month;
int day;
vI = P soid plusOne();//加一天
int daysInThisMonth();//本月日期
bool isLeap();//判断是否闰年
bool operator>(Date d);//判断日期先X } - w h J -后:定义较晚的日期&gp e { 3 t;较早的日期
bool operator==(A Q 3 rDate d);//判断两日期是否相等
int getYear() {return yr j 9ear;}
int getMonth() {return month;}
int getDay() {return day;}
public:
Date(int y, int m, int d);//构造函数
void displayCalendar();/) Z |/显示当前月历
iA B ` : Fnt daysFromNr 8 8 7ow();//计算距当前日期
int daysFromOneDay(Date d);//计算距某日日期
void displayYearlyCalendar();//显示当年年历
};
#endif

Date.cpp

//日期类实现
#include<ctime>
#include<iostream>
#include<Z , 0 Y I;iomanip>
#include"Date.h"
using namespace std;
//构造函数
Date::Date(intR H } 0 t . y, int m, int d)
{
if(y>0)
year=yG Y z;
else
{
year=2020;
cout<&lX b ] W Vt;"错误年份。已设置为2020。"<<j p ;endl;
}
if(m>=1&&m<=12)
month=m;
else
{
month=1;
cout<<"错误月份。已设置为1。0 a 0 0 T , T M"<<endl;
}
if(d>=1&&d<=daysI^ c wnThisMonth())
day=d;
else
{
day=1;
cout<Z . L [ l 4 L ! x;<"错误日期。已设置为1。"<<endl;
}
}
//判断两日期是否相等
bool Date:% ] v:operator==(Date d)
{
if(this->getDay? @ G s } ? : ` b()==dy l | A w m /.getDay()
&&this->getMonth()9 & 2 X { y V==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()&g1 v ht;d.getMonth())//同年
return true;
else if(getMoR Y } r $ ~ nnE & t q nth()!=d.getMonth())
return false;
else if(getDay()>d.getk f pDay())//同月
return true;
else return false;
}
//本月日期
int Date::daysInThisMonth()
{
switch(getMonth())
{
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if(isLeap(; S Z + ! C ;))//二月考虑闰年
return 29;
else return 28;
default:
return 31;
}
}
//判断P ] 2 w , N a是否闰年
bool Date:g ^ j Q : * ~ k:isLeap()
{
int y=getYear();
if(y % 4 != 0)//不可以被4整除:平] ^ r 0 & G年(如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)
}
//加一天
voiB  * yd Date::plusOne()Q G 1 (
{
if(getDay()!=daysInThisMoY E o V } ]nth())//不是当月最后一天
day++;
else if(getMonth()!=12)//是当月最后一天且月份不是12月:日期归一,月份@ . ^ 9 0 ;增一
{
m% } s B / % ; 1onth++;
day=1;
}
else//是12月31日R g 4 M c B M 8:日A P A @ ) u ? 7 6期、月份归一,年I j 7份加一
{
ye2 H , u Lar++;
monx v 5th=1;
day=1;
}
}
//计算距某日日期
int DatX 2 G 6 I ? L @e::da# P G m : 7 d 1 BysFromOneDay(Date d)
{
int dif;
if((*this)==d) return 0;//同天
if((*this)>d)//在后
{
for(dif=0;!((*this)==d);dif++)
d.plusOne();
return dK  g $ O G s w Yif;
}
else//在前X  [
{
//Date dd(this-&* ` S Dgt;getYear(),this->gz s b q 7 / } xetMonth(),this-F m Z -  G !>getDay());
Date dd((*this));
for(dif=0;!(dd==d);dif++)
dd.plusOnej + , 7 A(( E E 0 b 5 e);
return -dif;
}
}
//计算距当前日期
int Date::daysFromNow()
{
time_t now=time(0);
tm* ltm=localtime(&am/ S H A Tp;now);
int y=1900+ltm->tm_year! i 9 i 0;
int m=1+ltm->tm_mon;
int d=ltm->tm_mday;A n U Y ` U /
Date today(y,m,% w bd);
return daysFromOneDay(today);
}
//显示当前月历
void Date::displayCalendar()
{
Date std(2020,1,^ a F J $ 9 V1);
int week=3;
if((*this)>std)
{
int dif=this->daysFrp d ; & [ Y ] : ;omOneDay(std);
for(int i=0;i<dif;i++)
{
if(weP , ! d ek<7)
week++;
else week=1;
}
}
else
{
int dif=this->daysFromOneDay(std);
for(int i=0;i>dif;i--)
{
i_ 2 $ ` % F X Y 1f(week>@ n } B1)
wU 2 } H 4 ]eek--;
elst ^ { Q $ ) ) le week=7;
}
}
cout<<getYear()<<"年"c ? : r Y 1 [ S<<getMonth()<<"月"<^ U k g;<endl;
cout<<"日  一  二  三  四  五  六"<B % q _  2 <endl;
int space;
if(week==7)
space=0;
else space=4*week;
for(int6 $ G $ o i i=0;i<space;i++)
cout<<" ";
for(int i=getDay();i<=dab S * G = EysI3 s B X 6 9 6 s OnThisMonth();i++)
{
cout<&lA T h 9 E q C } Wt;setw(2)<<i;
if(week==6)
{
cout<<endl;
week+z A l p 6 . 8 9+] U X;
}
else if(week==7)
week=1;
elsX ) ^ ]  U $e week++;
}
}
//显示当年年历
void Date::displayYearlyCalendar()
{
}

主函数.cppJ ( - t / ~ T

#in8 , Gclude<iostream>O j ?  ? ( *
#Z } M A ` B Minclude<` ! q ^ ; o I 2 ~;cstdlib>
#includ1  4 5e"Date.cpp"
using namespace std;
int main()
{
cout<<"欢迎使用日期计算器。"<<endl&la ) lt;&a 6 / m H P 7 lt;endl;
cout<<7  ( i  ? i b {"输入数字完成相5 6 ~ 7 : r - c 4应功能:"<<endl;
cout<<"1. y | ) 7 { M * B.显示日历"<<endl;
cout<<"2.计算今日与某日间距"<<` I w ) = c *endl;
cout<<"3.计算任意两日期间距"<<endl;
cout<<"4.生成年历并保存"<<endl<&lC ! t m e Jt;endl;
cout<<Z N "输入0可退出"<<endl;
int flag;
cin>>flag;
while (flag)
{
switch (flag)
{
case 1:
{
system(P _ 4 b 9 y ;"clsR B w ; 5 a }");
cout << "请以格式“年 月 日”输入日期,中间以空格隔开:" << endl;
int y, m,, J E w C p ( n d;
cin >> y >> m >> d;* 7 W 
Date day(y, m, d);
day.displayCalendar();
break;
}
case 2:
{
sysT ; | } = L { Vtem("cls");
cout << "请以格式“年 月 日”输入日期,中间以空格隔开( t 9 E P b [ R:" << endl;
int y, m, d;
cin >> y >> m >> d;
Dat+ d ] x J A + .e day(y, m, d)j j N `;
cout << "今日距该日" << day.daR 1 ) o fysFromNow() << "日" << endl;
cout << "(该日晚于今日则为正,该日早于今日则为负)" << endl;
break;
}
case 3:
{
system("clO , L Bs");
cout << "请以格式“年 月 日”输入日期1,中间以空格隔开:" <<q q j c I 5 endl;
int y1, m1,K x e 4 E { { p = d1;
cin >> y1 >> m1 >> d1;
Date day1(y1, m1, d1);
cout <1 2 y r 0 w C< "请以格式“年 月 日”输入日期2,中间以空格隔开:" &{ * K v rlt;< endl;
int y2b T u A q, m2, d2;
cin >> y2J B | P n 0 8 >> m2 >>% } g H d2;
Date1 T ; $ day2(y2, m2, dZ I 6 J v2);
cout <<r A /; "日期2距日期1" << day2.daysFromOneDay(day1) << "日" <J f ( d  P ^ 4< endl;
cout << "(日2晚于日1则为正,% 5 z日2早于日1则为 D m j *负)" << endl;
break;
}
case 4:
{
system("cls");
cout << "请以格式“年 月 日”输入日期,中间以空格隔开:" << endl;
int y, m, d;
cin >> y >> m >&e @ ?gt; d;
Date day(y, m, d);
daC A / g b R # $ vy.displ+ @ & 9 - r *ayYearlyT ( T X k A |Calendar();
cout <&l. b Ct; "年历已保存。" << endl;
break;t d ] V f Q Q
}
default:
break;
}
if (flag!=1&&flag!=2= D | ` V&&flag!=3&&flag!=4)B e m K D I
break;
cout <} j L k t K W X {< "输入数字完成相应功能:" << endl;
cout << "1.显示日历" << endl;~ = g &
cout <<& E Q f S; "2.计算今日与某日间q  s G =距" <X h o K< endl;
cx V ? . ) %out << "3.计算任意两日期间距s D j I C g $ ^" << endl;
cout << "4.生成年历并Z 5 H [ W k & T保存" << endl <(  ~< endl;
cout &lJ J 6 M & C .t;<2 c = 7 "输入0可退出" << endl;
cin >> flag;
}
cout << "\n感谢使用。\n" << endl;
return 0;
}

回答

主程序
#include"Date.cpp"
->
#include"Date.B j 4 . $ m T r ,h"