帮朋友问个问题,代码如下;
#include<iostream>
#include <string>
using namespace std;
class birth //定义一个出生日期类
{
public:
birth(int y = 1990, int m = 9, int d =29) //构造
{ year = y, month = m, day = d;}
birth(birth &q); //birth复制构造
int getYear() {return year;}
int getMonth() {return month;}
int getDay() {return day;}
~birth(){} //析构
private:
int year, month, day;
};
birth::birth(birth &q):year(q.year),month(q.month),day(q.day){} //birth复制构造的实现
class people //定义一个人员类,为类的组合
{public:
people() //构造(无参数重载)
{
const string name = "史佑明";const string sex = "男";const int oldrear=22;const string id="411381199009292102";
m_name=name;m_sex=sex,m_id=id;m_oldyear=oldrear;
print1();
}
people(const birth &bir, const string &name = "史佑明",const string &sex = "男",const int oldyear=22,const string &id="411381199009292102" )/*构造(有参数重载)*/
: m_name(name), m_birthday(bir), m_sex(sex),m_id(id),m_oldyear(oldyear)
{
print2();
}
void print1()//无参重载中成员函数print1()的实现
{
cout <<"原始资料:"<<endl<< "姓名:" << m_name ;
cout << "" << m_sex <<""<<"年龄:"<<m_oldyear<<"";
cout << "出生日期:" << m_birthday.getYear() << "年" << m_birthday.getMonth()<<"月"
<< m_birthday.getDay() <<"日"<<"";
cout<<"身份证号"<<m_id<<endl;
}
void print2()//有参重载中成员函数print2()的实现
{
cout <<"新增资料:"<<endl<< "姓名:" << m_name ;
cout << "" << m_sex <<""<<"年龄:"<<m_oldyear<<"";
cout << "出生日期:" << m_birthday.getYear() << "年" << m_birthday.getMonth()<<"月"
<< m_birthday.getDay() <<"日"<<"";
cout<<"身份证号"<<m_id<<endl;
}
people(people &f);//people类复制构造函数
~people(){} //析构
private:
birth m_birthday;
string m_name;
string m_sex;
int m_oldyear;
string m_id;
};
people::people(people &f):m_birthday(f.m_birthday),m_name(f.m_name), m_sex(f.m_sex),m_id(f.m_id),m_oldyear(f.m_oldyear){}
//people类复制构造函数的实现
int main()
{
people p;
cout<<"请输入新增资料信息:姓名:性别: 年龄: 证件号(身份证号):";
cout<<"出生日期:年:月:日:";
string na,se,id;
int od,ye,mo,da;
cin>>na>>se>>od>>id>>ye>>mo>>da;
birth birthday1(ye,mo,da);
people people1(birthday1,na,se,od,id);
return 0;
}
运行后错误:error C2558: class 'birth' : no copy constructor available
birth(birth &q); //birth 改为 birth(const birth &q); //birth复制构造
相应的
birth::birth(birth &q):year(q.year),month(q.month),day(q.day){} //birth复制构造的实现
改为:
birth::birth(const birth &q):year(q.year),month(q.month),day(q.day){} //birth复制构造的实现
原因:
people(const birth &bir, const string &name = "史佑明",const string &sex = "男",const int oldyear=22,const string &id="411381199009292102" )/*构造(有参数重载)*/: m_name(name), m_birthday(bir), m_sex(sex),m_id(id),m_oldyear(oldyear)
people的构造函数中传递的是指向const birth的引用bir,初始化成员列表中m_birthday(bir)调用拷贝构造函数,但是你的拷贝构造函数写的是birth::birth(birth &q),参数是指向birth的引用,无法默认将一个const对象转换为一个非const对象,所以会出错。