一道C++问题,为什么编译时连接会出错?

#include<iostream>usingnamespacestd;classDate{public:Date();Date(intm=1,intd=1,inty=1... #include <iostream>
using namespace std;
class Date
{
public:Date();
Date(int m=1,int d=1,int y=1992):month(m),day(d),year(y){};
void display()
{
cout<<"Date:"<<endl;
cout<<"year:"<<year<<endl;
cout<<"month:"<<month<<endl;
cout<<"day:"<<day<<endl;
}
private:int month,day,year;
};
class People
{
public:People();
People(long num,char s,int m,int y,int d,long i)
:number(num),sex(s),birthday(m,d,y),id(i){};
~People()
{
delete this;
cout<<"Destrutor called."<<endl;
};
friend void set(People&);
inline void display();
private:long number,id;
char sex;
Date birthday;
};

void set(People&peo)
{
long number,id;
char sex;
int month,day,year;
cout<<"请输入人员信息:"<<endl;
cin>>number>>sex>>month>>day>>year>>id;
People peo1(number,sex,month,day,year,id);
peo=peo1;
}
void People::display()
{
cout<<"Information:"<<endl;
cout<<"number:"<<number;
cout<<"sex:"<<sex;
cout<<"id:"<<id<<endl;
birthday.display();
}
int main()
{
People peo;
set(peo);
cout<<"该人员信息为:"<<endl;
peo.display();
system ("pause");
return 0;
}
[Linker error] undefined reference to `People::People()'
ld returned 1 exit status
展开
 我来答
domain_pro
2011-06-20 · TA获得超过279个赞
知道小有建树答主
回答量:359
采纳率:0%
帮助的人:271万
展开全部
有3点
1.*************************************
Date();
Date(int m=1,int d=1,int y=1992):month(m),day(d),year(y){};
两者都是默认构造,为什么重复定义?保留一个就可以了
这个与下面people里的构造函数有本质区别,你给参数指定了默认值,就是默认构造函数了,Date()也是默认构造,是系统免费送的,一般书上不讲的
2.***************************************
~People()
{
delete this; //敢问你在delete神马?浮云吗?new都没有你delete啥东东着呢
cout<<"Destrutor called."<<endl;
};
3.*******************
People();改为People(){};

另外,peo=peo1这里建议做一个运算符重载
追问
首先,非常感谢您的回答,可是还有几点我没理解
1.date()是为了可以声明一个date型变量,而不赋初值啊,与people()一样啊,我觉得没什么本质上的不同
2.deleteb必须要和new成对吗?delete this 是删除当前对象啊,这样不可以吗?
3.People();改为People(){};
有什么用吗?有什么区别?
4.直接使用对象的赋值为什么不行?还需要再做运算重载吗?再说C++中“=”不是不需要做运算重载吗?
再次深表感谢!!!
追答
1.date()这是声明函数,怎么能是声明变量呢?你c语言没学好呀!
date()这是构造函数,是对象实例化的时候首先调用的函数,c++的编译器在你没提供任何构造函数的时候,给你送一个无参构造函数,就是date(),但如果它发现你的代码中有构造函数,它就不再送你这个函数了,哪怕你还是需要一个无参构造函数,也要手写

2.deleteb必须要和new成对吗?delete this 是删除当前对象啊,这样不可以吗?
显然是不行啊!如果你没给this申请内存,delete肯定出错。这里的this的内存是系统分配的,由系统回收,以后看到new和delete没有成对出现,程序必然错了,能运行也是错的!如果这么写,不要去找c++开发的工作,没人要你的

3.People();改为People(){}; 有什么用吗?有什么区别?
前者是声明,没有定义函数体,后者是定义,{}里没东西表示这个函数什么都不做。

4.直接使用对象的赋值为什么不行?还需要再做运算重载吗?再说C++中“=”不是不需要做运算重载吗?
对象的直接赋值在有些默认情况下是允许的,但是不能保证程序的完整性。对象是一组内容的集合,如果没有准确的重载定义,赋值可能会出错或导致数据丢失,这在c++的书中都有提到的。=在做对象赋值对象的时候是需要重载的。

基本可以看出,你是个新手,语法还没有掌握。c++麻烦的就是逻辑性,如果不严谨,一个错误可能埋藏的很深,很不容易找。你最好先巩固一下语法,再把c++啃透。
新手上路难免磕磕绊绊,很正常,老手也会犯一些低级错误,没关系,慢慢来。你平时调试程序的时候最好是出了错纠正过来以后,再把程序往错里改,也就是说你要问自己:如果这么改会怎么样,改来改去你对c++的了解就深入了。
niujie1314
2011-06-19
知道答主
回答量:20
采纳率:0%
帮助的人:0
展开全部
#include <iostream>
using namespace std;
class Date
{
public:
//Date(){}
Date(int m=1,int d=1,int y=1992):month(m),day(d),year(y){};
void display()
{
cout<<"Date:"<<endl;
cout<<"year:"<<year<<endl;
cout<<"month:"<<month<<endl;
cout<<"day:"<<day<<endl;
}
private:
int month,day,year;
};
class People
{
public:
People(){}
People(long num,char s,int m,int y,int d,long i)
:number(num),sex(s),birthday(m,d,y),id(i){}
/*~People()
{
delete this;
cout<<"Destrutor called."<<endl;
}*/
friend void set(People&);
inline void display();
private:
long number,id;
char sex;
Date birthday;
};

void set(People& peo)
{
long number,id;
char sex;
int month,day,year;
cout<<"请输入人员信息:"<<endl;
cin>>number>>sex>>month>>day>>year>>id;
People peo1(number,sex,month,day,year,id);
peo=peo1;
}
void People::display()
{
cout<<"Information:"<<endl;
cout<<"number:"<<number;
cout<<"sex:"<<sex;
cout<<"id:"<<id<<endl;
birthday.display();
}
int main()
{
People peo;
set(peo);
cout<<"该人员信息为:"<<endl;
peo.display();
system ("pause");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cocopark1982
2011-06-19 · TA获得超过348个赞
知道小有建树答主
回答量:556
采纳率:0%
帮助的人:490万
展开全部
class People
{
public:People();
改成
public:People(){}
更多追问追答
追问
改过之后还是有错  In constructor `People::People()': call of overloaded `Date()' is ambiguous 
note : candidates are: Date::Date(int, int, int)
note : Date::Date()
追答
public:Date(); 
改为
public:Date(){}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xuan风乱舞
2011-06-19
知道答主
回答量:31
采纳率:0%
帮助的人:8.9万
展开全部
系统问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式