用C++做通讯录的问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 14:31:03
我正在做一个通讯录的程序,遇到一些问题:
1.如何将各种人(商务、教育、个人)按输入的先后顺序分配ID(从1开始)?
2.如何将每个人的各项资料(包括自身的class信息)全部写入一个DAT文件,之后再将所有人全部内容按ID顺序都显示出来?
3.在删除一个人的资料后该ID会留空,重新输入另一个人的资料时如何找到这个空缺的ID并填补进去?

谁能帮我解决一下?

类说明:
基类Person派生Commercial、Educational、Personal
Commercial派生Manager、Worker
Educational派生Teacher、Student
Personal派生Relative、Friend

有一个方法可供你参考:
1.在class Person中定义两个静态变量,如static int m_FirstBlank(这个是为了插入用)和static int m_MaxID(这个是为了按顺序输出用),分别表示第一个空缺的的ID和最大的ID值,m_FirstBlank初值为1,m_MaxID初值为0

2.当加入一个人的资料时进行这样的操作:
while(m_PersonInfoMap[++m_FirstBlank] != NULL){}
if(m_MaxID < m_FirstBlank) m_MaxID = m_FirstBlank;
当删除一个人的资料时进行这样的操作:(ID表示当前人的ID)
if(m_FirstBlank > ID) m_FirstBlank = ID;
if(m_MaxID == ID) m_MaxID--;

3.在管理这个Person类的类,如class Manager,中定义一个映射(STL中的map),如:std::map<int, Person*> m_PersonInfoMap;其中的int表示ID,Person*表示ID所对应的Person对象指针(用映射是为了避免添加、删除时移动元素)
设当前要插入或删除的Person对象指针为Person* pCurPerson,则
当插入一个人的资料时进行:
m_PersonInfoMap.insert(std::map<int, Person*>::value_type(Person::m_FirstBlank, pCurPerson));
当删除一个人的资料时进行:
m_PersonInfoMap.erase(ID);

4.结合2,3就是:
当插入一个人的资料时进行:
Person类中:
while(m_PersonInfoMap[++m_FirstBlank] != NULL){}
if(m_MaxID < m_FirstBlank) m_MaxID = m_FirstBlank;
Manager类中: