【C++OJ拷贝构造】手机服务(构造+拷贝构造+堆)
题目描述
输入
输出
输入样例
输出样例
参考代码
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
class Date // Date类
{
private:
int year;
int month;
int day;
public:
Date() {}
Date(int y, int m, int d) : year(y), month(m), day(d) {}
void set(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
int getyear() { return year; }
int getmonth() { return month; }
int getday() { return day; }
~Date() {}
};
class phone
{
private:
char type;
char *num;
int state;
Date *d1;
public:
phone() {}
phone(char t, char *n, int s) //有参构造,初始化
{
type = t;
num = new char[12]; //这里也可以直接num=n
strcpy(num, n);
state = s;
d1 = nullptr; //指针初始化为空
cout << "Construct a new phone " << num << endl;
}
phone(const phone &p) //拷贝构造,复制已有对象的信息,并输出提示信息
{
type = 'D'; //号码备份,类型改为D,手机号码末尾加字母X
num = new char[12]; // new空间复制号码
strcpy(num, p.num);
state = p.state;
d1 = nullptr; //指针初始化为空
cout << "Construct a copy of phone " << num << endl;
char *s = "X";
strcat(num, s);
}
void print() //打印功能,把对象的所有属性都输出
{
switch (type)
{
case 'A':
cout << "类型=机构";
break;
case 'B':
cout << "类型=企业";
break;
case 'C':
cout << "类型=个人";
break;
case 'D':
cout << "类型=备份";
break;
}
cout << "||号码=" << num;
switch (state)
{
case 1:
cout << "||State=在用" << endl;
break;
case 2:
cout << "||State=未用" << endl;
break;
case 3:
cout << "||State=停用 ||停机日期=" << d1->getyear() << "." << d1->getmonth() << "." << d1->getday() << endl; //指针对象访问使用->
break;
}
}
void stop(Date &d2) //停机功能是停用当前号码,参数是停机日期,无返回值
{
state = 3; //操作是把状态改成停用
d1 = new Date(d2.getyear(), d2.getmonth(), d2.getday()); //并停机日期指针创建为动态对象,并根据参数来设置停机日期
cout << "Stop the phone " << num << endl; //输出提示信息
}
~phone()
{
if (d1 != nullptr)
delete d1;
}
};
int main()
{
int f;
cin >> f;
//输入6个参数,包括号码类型、号码、状态、停机的年、月、日
char t;
char n[12];
int s, y, m, d;
while (f--)
{
cin >> t >> n >> s >> y >> m >> d;
phone p1(t, n, s); //刚开始日期指针为空
Date d1(y, m, d); //构造日期
p1.print();
phone p2(p1); //调用拷贝构造函数
p2.print();
p1.stop(d1); //停用,传入的是日期类
p1.print();
cout << "----" << endl;
}
}