【C++OJ拷贝构造】手机服务(构造+拷贝构造+堆)

本文介绍了如何使用C++设计一个手机服务类,包括构造函数、拷贝构造函数、打印方法和停机功能。类中包含号码类型、号码、号码状态和停机日期等属性。在主函数中展示了号码备份和停机操作的实现,通过输入不同参数创建和操作多个手机实例。示例输出展示了构造、拷贝和停机过程的信息。
摘要由CSDN通过智能技术生成

【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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ferry_xie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值