【C++OJ拷贝构造】手机服务(构造+拷贝构造+堆)
题目描述
设计一个类来实现手机的功能。它包含私有属性:号码类型、号码、号码状态、停机日期;包含方法:构造、拷贝构造、打印、停机。
1、号码类型表示用户类别,只用单个字母,A表示机构,B表示企业、C表示个人
2、号码是11位整数,用一个字符串表示
3、号码状态用一个数字表示,1、2、3分别表示在用、未用、停用
4、停机日期是一个日期对象指针,在初始化时该成员指向空,该日期类包含私有属性年月日,以及构造函数和打印函数等
----------------------------------------
5、构造函数的作用就是接受外来参数,并设置各个属性值,并输出提示信息,看示例输出
6、拷贝构造的作用是复制已有对象的信息,并输出提示信息,看示例输出。
想一下停机日期该如何复制,没有停机如何复制??已经停机又如何复制??
7、打印功能是把对象的所有属性都输出,输出格式看示例
8、停机功能是停用当前号码,参数是停机日期,无返回值,操作是把状态改成停用,并停机日期指针创建为动态对象,并根据参数来设置停机日期,最后输出提示信息,看示例输出
-------------------------------------------
要求:在主函数中实现号码备份的功能,对已有的虚拟手机号的所有信息进行复制,并将号码类型改成D表示备份;将手机号码末尾加字母X
输入
第一行输入t表示有t个号码
第二行输入6个参数,包括号码类型、号码、状态、停机的年、月、日,用空格隔开
依次输入t行
输出
每个示例输出三行,依次输出原号码信息、备份号码信息和原号码停机后的信息
每个示例之间用短划线(四个)分割开,看示例输出
输入样例
2
A 15712345678 1 2015 1 1
B 13287654321 2 2012 12 12
输出样例
Construct a new phone 15712345678
类型=机构||号码=15712345678||State=在用
Construct a copy of phone 15712345678
类型=备份||号码=15712345678X||State=在用
Stop the phone 15712345678类型=机构||号码=15712345678||State=停用 ||停机日期=2015.1.1
Construct a new phone 13287654321
类型=企业||号码=13287654321||State=未用
Construct a copy of phone 13287654321
类型=备份||号码=13287654321X||State=未用
Stop the phone 13287654321类型=企业||号码=13287654321||State=停用 ||停机日期=2012.12.12
参考代码
#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;
}
}