- 题目分析
建立一个手机通讯录系统。手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上。存储在手机卡的联系人的信息只包含用户名和电话号码两项信息。存储在手机上的联系人的信息包括姓名、电话号码,QQ号码、籍贯。根据题目要求实现功能。
手机卡联系人文件和手机联系人文件事先已经写好,名字分别是PhoneCard和Phone,格式为文本文件。
我做的通讯录管理系统一共包括七个类。
前两个类是信息类,分别是手机卡上联系人和手机联系人的信息,第二个类继承第三个类。
第三个类是一个虚基类,包含增、删、查、改、浏览的虚函数。
第四个类继承第三个虚基类,是手机卡上联系人的操作类。数据成员是第一个类的动态对象数组,一个映照容器将联系人名字和该联系人在动态数组的位置联系起来。成员函数包括增、删、查、改、浏览,动态数组相对普通的对象数组操作简单,可直接调用STL的vector类中的函数,映照容器的应用使查找元素进行操作变得相对简单。这个类中的构造函数和析构函数包括了文件的读出和写入。这个类中的Delete函数,实际上并未从对象数组中真正删除,只是设立了一个bool型数组vis[1001],将要删除元素数组的vis值设立为true(已访问)在写入文件时只写入vis值为false的数组,以此实现删除。
第五个类与第四个类操作完全类似,是对手机联系人的操作类。
第六个类是一个用户类,在这个类中第三个类得到利用,实现了多态。数据成员是第四个类和第五个类的对象。在类中进行选择操作,确定对手机卡联系人进行操作还是对手机联系人进行操作。除了前两个类的增、删、查、改、浏览操作,这里还包括了从手机卡和手机联系人的双向移动和双向复制操作函数。
第七个类是菜单类,显示用户界面进行操作。
二、实现代码
//PhoneCard.h
//在codeblocks建立的工程include文件夹下的PhoneCard.h
//第一个类的头文件
#ifndef PHONECARD_H
#define PHONECARD_H
#include<string>
#include<iostream>
using namespace std;
class PhoneCard
{
protected:
string Name;
string PhoneNumber;
public:
void setName(string name);
void setPhoneNumber(string phonenumber);
string getName();
string getPhoneNumber();
PhoneCard();
PhoneCard(string name,string phonenumber);
friend istream&operator>>(istream&input,PhoneCard&phoneC);
friend ostream&operator<<(ostream&output,PhoneCard&phoneC);
};
#endif // PHONECARD_H
//Phone.cpp
//工程中src文件夹下的P hone.cpp文件
//第一个类的cpp文件
#include "PhoneCard.h"
void PhoneCard::setName(string name){Name=name;}
void PhoneCard::setPhoneNumber(string phonenumber){PhoneNumber=phonenumber;}
string PhoneCard::getName(){return Name;}
string PhoneCard::getPhoneNumber(){return PhoneNumber;}
PhoneCard::PhoneCard(){}
PhoneCard::PhoneCard(string name,string phonenumber):
Name(name),PhoneNumber(phonenumber){}
istream&operator>>(istream&input,PhoneCard&phoneC)
{
input>>phoneC.Name>>phoneC.PhoneNumber;
return input;
}
ostream&operator<<(ostream&output,PhoneCard&phoneC)
{
output<<phoneC.Name<<" "<<phoneC.PhoneNumber;
return output;
}
/*
PhoneCard类,存储在手机卡的联系人的信息类
数据成员包括Name联系人姓名,PhoneNumber电话号码
操作函数一组set函数,修改数据成员的值
一组get函数,得到数据成员的值
必备的无参构造函数和自定义构造函数
重载插入和提取运算符。
*/
//Phone.h
//include文件夹的Phone.h
//第二个类的头文件
#ifndef PHONE_H
#define PHONE_H
#include<string>
#include<iostream>
#include"PhoneCard.h"
using namespace std;
class Phone : public PhoneCard
{
private:
string QQnumber;
string Address;
public:
void setQQnumber(string qq);
void setAddress(string address);
string getQQnumber();
string getAddress();
Phone();
Phone(string name,string phonenumber,string qq,string address);
friend istream&operator>>(istream&input,Phone&p);
friend ostream&operator<<(ostream&output,Phone&p);
};
#endif
// PHONE_H
//Phone.cpp
//src文件夹的Phone.cpp
//第二个类的cpp文件
#include "Phone.h"
void Phone::setQQnumber(string qq){QQnumber=qq;}
void Phone::setAddress(string address){Address=address;}
string Phone::getQQnumber(){return QQnumber;}
string Phone::getAddress(){return Address;}
Phone::Phone(){}
Phone::Phone(string name,string phonenumber,string qq,string address):
PhoneCard(name,phonenumber),QQnumber(qq),Address(address){}
istream&operator>>(istream&input,Phone&p)
{
input>>p.Name>>p.PhoneNumber>>p.QQnumber>>p.Address;
return input;
}
ostream&operator<<(ostream&output,Phone&p)
{
output<<p.Name<<" "<<p.PhoneNumber<<" "<<p.QQnumber&