OJ题之手机服务(构造+拷贝构造+堆)

2023-07-30 09:45:01 浏览数 (1)

题目描述

设计一个类来实现手机的功能。它包含私有属性:号码类型、号码、号码状态、停机日期;包含方法:构造、拷贝构造、打印、停机。

1、号码类型表示用户类别,只用单个字母,A表示机构,B表示企业、C表示个人

2、号码是11位整数,用一个字符串表示

3、号码状态用一个数字表示,1、2、3分别表示在用、未用、停用

4、停机日期是一个日期对象指针,在初始化时该成员指向空,该日期类包含私有属性年月日,以及构造函数和打印函数等

----------------------------------------

5、构造函数的作用就是接受外来参数,并设置各个属性值,并输出提示信息,看示例输出

6、拷贝构造的作用是复制已有对象的信息,并输出提示信息,看示例输出。

想一下停机日期该如何复制,没有停机如何复制??已经停机又如何复制??

7、打印功能是把对象的所有属性都输出,输出格式看示例

8、停机功能是停用当前号码,参数是停机日期,无返回值,操作是把状态改成停用,并停机日期指针创建为动态对象,并根据参数来设置停机日期,最后输出提示信息,看示例输出

-------------------------------------------

要求:在主函数中实现号码备份的功能,对已有的虚拟手机号的所有信息进行复制,并将号码类型改成D表示备份;将手机号码末尾加字母X

输入

第一行输入t表示有t个号码

第二行输入6个参数,包括号码类型、号码、状态、停机的年、月、日,用空格隔开

依次输入t行

输出

每个示例输出三行,依次输出原号码信息、备份号码信息和原号码停机后的信息

每个示例之间用短划线(四个)分割开,看示例输出

输入样例1

2 A 15712345678 1 2015 1 1 B 13287654321 2 2012 12 12

输出样例1

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 ----

思路分析

题目文字很多,在打代码的过程中发现一些问题,这里说一下。

题目说停机日期是一个日期对象指针,在初始化时该成员指向空,这里很重要,因为一个空指针很招事。

说这个日期类也要有构造函数,还必须是接受外来参数,并设置各个属性值,这里似乎也没有问题,对吧。

但来手机类的拷贝构造函数时,问题出现了,这个停机日期怎么复制,它只是一个指针,还有可能是一个空指针,那么我们只能在它不是空指针的时候给它复制吧,这又涉及到了一个问题,对于一个指针,怎么样达到复制的目的?唉,这不是直接用赋值运算符=就完事了吗?好了,这操作叫浅拷贝,如果这样做的话,表面上来看的话,似乎也达到了复制目的,但实际上更应该叫共用而不是复制,因为它们两个指向了同一块内存。所以我们需要复制的是指针指向的内容而不是指针本身,这叫深拷贝,这意味着我们首先需要申请堆内存,然后复制内容。

好了,最意外的事情又发生了,申请堆内存的语句报错了!!!

我们前面强调到这个日期类的构造函数是带参数的,所以在new一个日期类对象的时候就要传入参数,问题又来了,还需要注意你的日期类成员函数可以返回私有数据成员。

好像还要在手机号末尾插入一个X,我们用的是string类,所以用insert函数在末尾插进去完事。

AC代码

代码语言:javascript复制
#include<iostream>
#include<string>
using namespace std;
class date
{
	private:
		int year,month,day;
	public:
		date(int year,int month,int day):year(year),month(month),day(day){}
		void print()
		{
			cout<<year<<'.'<<month<<'.'<<day<<endl;
		}
		int Year()
		{
			return year;
		}
		int Month()
		{
			return month;
		}
		int Day()
		{
			return day;
		}
};
class phone
{
	private:
		string kind,num;
		int state;
		date *time=NULL;
	public:
		phone(string kind,string num,int state):kind(kind),num(num),state(state){cout<<"Construct a new phone "<<num<<endl;print();}
		phone(phone & mi)
		{
			kind='D';
			num=mi.num;
			cout<<"Construct a copy of phone "<<num<<endl;
			num.insert(num.end(),'X');
			state=mi.state;
			if(mi.time)
			{
				time=new date(mi.time->Year(),mi.time->Month(),mi.time->Day());
			}
			print();	
		}
		void print()
		{
			string State[3]={"在用","未用","停用"};
			string Kind[4]={"A","B","C","D"};
			if(kind==Kind[0])
			cout<<"类型=机构||";
			else if(kind==Kind[1])
			cout<<"类型=企业||";
            else if(kind==Kind[2])
			cout<<"类型=个人||";
            else
			cout<<"类型=备份||";
			cout<<"号码="<<num<<"||State="<<State[state-1];
			if(time)
			{
				cout<<" ||停机日期=";
				time->print();
			}
			else
			cout<<endl;						
		}
		void stop(date time)
		{
			state=3;
			this->time=new date(time.Year(),time.Month(),time.Day());
			cout<<"Stop the phone "<<num<<endl;
			print();
		}
		~phone()
		{
			if(time)
			delete time;
		}
};
int main()
{
	int t,year,month,day,state;
	string kind,num;
	cin>>t;
	while(t--)
	{
		cin>>kind>>num>>state>>year>>month>>day;
		date time(year,month,day);
		phone mi(kind,num,state);
		phone redmi(mi);
		mi.stop(time);
		cout<<"----"<<endl;
	}
	return 0;
}

0 人点赞