</pre>好友列表MAIN.CPP<pre name="code" class="cpp">#include "friend.h"
int AddGroupFriend(UserInfo *p,UserInfo *group[],int n)
{
if(p == NULL || group == NULL) return -1;
int pos = 0;
while(pos < n && group[pos] != NULL)
{
if(!p->AddFriend(group[pos++]))
{
cout<<"添加朋友失败!"<<endl;
}
}
return pos;
}
void ShowAllInfo(UserInfo *p)
{
cout<<"******** 朋友信息 **************"<<endl;
p->ShowFriend();
cout<<"******** 个人信息 **************"<<endl;
p->ShowInfo();
}
void ShowAllInfo(UserInfo *group[],int n)
{
for(int i = 0; i < n; ++i)
{
if(group[i] != NULL)
{
cout<<"******** 第"<<i+1<<"个人信息"<<endl;
ShowAllInfo(group[i]);
cout<<endl;
}
}
}
void main()
{
SystemInfo sys;
//typedef set<Friend_Info>::iterator iter;
//iter it;
//cout<<typeid(*it).name()<<endl;
sys.AddUser("yanglei","4566","110","中国");
sys.AddUser("yanglei1","45","1881587","北京!");
sys.AddUser("yanglei2","456","1291587","西安!");
UserInfo *p = sys.GetUser("yanglei");
const int N = 2;
UserInfo *group[N] = {};
group[0] = sys.GetUser("yanglei1");
group[1] = sys.GetUser("yanglei2");
AddGroupFriend(p,group,N);
ShowAllInfo(p);//打印yanglei的个人信息
ShowAllInfo(group,N);//打印group的所有个人信息
cout<<endl<<endl;
p->DeleteFriend(group[0]);///yanglei删除了yanglei1
ShowAllInfo(p);//打印yanglei的个人信息
ShowAllInfo(group,N);//打印group的所有个人信息
//if(p == NULL) cout<<"NOT elem"<<endl;
//else
//{
// if(p->AddFriend(sys.GetUser("yanglei1")))
// cout<<"ADD success!"<<endl;
//}
//if(p->AddFriend(sys.GetUser("yanglei2")))
// cout<<"ADD success!"<<endl;
//p->ShowFriend();
//cout<<"******** 个人信息 **************"<<endl;
//p->ShowInfo();
//p->DeleteFriend(sys.GetUser("yanglei2"));
//cout<<"******** 删除以后 **************"<<endl;
//p->ShowFriend();
}
好友列表
#pragma once
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
#include <map>//
using namespace std;
const int Init_Len = 200;
const int ID_LEN=20;
const int NAME_LEN=20;
const int PWD_LEN=20;
const int RECV_BUFFER_LEN=1024;
const int BUFFER_LEN=1024;
const int IP_LEN=20;
const int STR_LEN=40;
class Friend_Info
{//存储的好友信息
public:
Friend_Info(char name[], char passwd[], char phone[], char addr[])
{
strcpy(mname, name);
strcpy(mpasswd, passwd);
strcpy(mphone, phone);
strcpy(maddr, addr);
}
Friend_Info(){}//默认构造
~Friend_Info(){}
void Change_Name(char name[])
{
memset(mname,0,sizeof(mname));
strcpy(mname, name);
}
void Change_Passwd(char passwd[])
{
memset(mpasswd,0,sizeof(mname));
strcpy(mpasswd, passwd);
}
void Change_Phone(char phone[])
{
memset(mphone,0,sizeof(mname));
strcpy(mphone, phone);
}
void Change_Addr(char addr[])
{
memset(maddr,0,sizeof(maddr));
strcpy(maddr, addr);
}
void operator=(Friend_Info &src)
{
if(&src == this) return ;//防止自赋值
Change_Name(src.mname);
Change_Passwd(src.mpasswd);
Change_Phone(src.mphone);
Change_Addr(src.maddr);
}
friend ostream& operator<<(ostream &out, const Friend_Info &src);
char* GetName(){return mname;}
char* GetName()const{return mname;}///////import
bool operator<( Friend_Info & src){return strcmp(mname,src.mname) < 0;}
bool operator<(const Friend_Info & src)const{return strcmp(mname,src.mname) < 0;}
bool operator==( Friend_Info & src){return strcmp(mname,src.mname) == 0;}
bool operator==(const Friend_Info & src)const{return strcmp(mname,src.mname) == 0;} //mutable///Imoprt 常量版本的
private:
mutable char mname[NAME_LEN];
char mpasswd[PWD_LEN];
char mphone[STR_LEN];
char maddr[STR_LEN];
};
ostream& operator<<(ostream &out,const Friend_Info &src)
{
out<<"name: "<<src.mname<<" ";
//out<<"name: "<<src.mpasswd<<" ";
out<<"phone: "<<src.mphone<<" ";
out<<"addr: "<<src.maddr<<endl;
return out;
}
class Friend_Table//好友表
{
public:
typedef set<Friend_Info>::iterator iter;
bool AddFriend( Friend_Info &src)//添加好友信息
{//////////////////////////////////////?????
iter it = find(mfriends_set.begin(),mfriends_set.end(),src);
//cout<<typeid(*it).name()<<endl;
if(it != mfriends_set.end()) return false;//已经存在
pair<set<Friend_Info>::iterator,bool> res = mfriends_set.insert(src);
return res.second;
}
bool DeleteFriend(Friend_Info &src)//添加好友信息
{
iter it = find(mfriends_set.begin(),mfriends_set.end(),src);
if(it == mfriends_set.end()) return false;//找不到
mfriends_set.erase(it);//删除 返回迭代器
return true;
}
int GetFriend_Num(){return mfriends_set.size();}
private:
set<Friend_Info> mfriends_set;
friend ostream& operator<<(ostream &out, Friend_Table &src);
};
ostream& operator<<(ostream &out, Friend_Table &src)
{//打印好友列表所有信息
for(Friend_Table::iter it = src.mfriends_set.begin(); it != src.mfriends_set.end(); ++it)
{
cout<<*it;
}
return out;
}
class UserInfo
{
public:
friend class SystemInfo;
UserInfo(){}
UserInfo(SystemInfo* sys):sysinfo(sys){}
UserInfo(char name[], char passwd[], char phone[], char addr[], SystemInfo* sys)
:myinfo(name, passwd,phone, addr),sysinfo(sys){}//带有自己初始信息的初始化
void ChangeUserInfo(Friend_Info &src){myinfo = src;}//改变自己的用户信息
bool AddFriend(UserInfo *src){ return AddFriend(*src);}//调用bool AddFriend(UserInfo &)
//bool AddFriend(const UserInfo &src){return AddFriend(const_cast<UserInfo*>(&src));}//调用AddFriend(UserInfo *)
bool AddFriend(UserInfo &src)
{//添加好友,双方同时添加
if(fr_table.GetFriend_Num() > Max_Friend || src.fr_table.GetFriend_Num() > Max_Friend)//超出上限
{
return false;//失败
}
bool res = fr_table.AddFriend(src.myinfo);//自己添加好友消息
if(!res) cout<<"UserInfo AddFriend error!"<<endl;
res = src.fr_table.AddFriend(myinfo);//对方也添加好友消息
if(!res) cout<<"UserInfo AddFriend error!"<<endl;
return true;
}
bool operator==(const UserInfo &src)const{return strcmp(myinfo.GetName(),src.myinfo.GetName()) == 0;}//比较名字是否相等
bool operator==(UserInfo &src){return strcmp(myinfo.GetName(),src.myinfo.GetName()) == 0;}//比较名字是否相等
bool DeleteFriend(UserInfo *src){return DeleteFriend(*src);}
bool DeleteFriend(UserInfo &src)
{//删除好友,双方同时删除
if(fr_table.GetFriend_Num() <= 0 || src.fr_table.GetFriend_Num() <= 0)//超出上限
{
return false;//失败
}
fr_table.DeleteFriend(src.myinfo);//自己添加好友消息
src.fr_table.DeleteFriend(myinfo);//对方也添加好友消息
return true;
}
void ShowFriend(){cout<<fr_table<<endl;}
void ShowInfo(){cout<<myinfo<<endl;}
UserInfo* FindUser(char* name);//查找用户根据ID
private:
Friend_Table fr_table;//好友表
//////////个人信息
Friend_Info myinfo;
SystemInfo *sysinfo;
static const int Max_Friend = 200;//最大好友数
};
class SystemInfo
{
public:
typedef set<UserInfo*>::iterator iter;
//////////
SystemInfo(){}
int UserNum(){return mSys_set.size();}
bool AddUser(char name[], char passwd[], char phone[], char addr[])
{
if( UserNum() > Max_User){return false;}
UserInfo* src = new UserInfo(name,passwd,phone,addr,this);//构造一个用户
if(src == NULL)
{
cerr<<"exit ! add user malloc error !"<<endl;
exit(0);
}
return AddUser(src);
}
bool GetUserIter(UserInfo* src,iter &it)
{//引用方式获取用户迭代器
it = find(mSys_set.begin(), mSys_set.end(), src );
if(it == mSys_set.end() ) return false;
return true;
}
bool AddUser(UserInfo *src)
{
if(mSys_set.size() > Max_User) return false;
pair<set<UserInfo*>::iterator,bool> res = mSys_set.insert(src);//插入
//接受插入的返回值,并且返回
return res.second;
}
bool DeleteUser(UserInfo *src)
{
if(mSys_set.size() <= 0) return false;
iter it;
if( GetUserIter(src,it) )//获取迭代器
{
mSys_set.erase(it);//删除用户
return true;
}
return false;
}
UserInfo *GetUser(char* name)
{
UserInfo temp;
temp.myinfo.Change_Name(name);
iter it;
for(it = mSys_set.begin() ; it != mSys_set.end(); ++it)
{
if( *(*it) == temp) return *it;//import !
}
//iter it = find(mSys_set.begin(),mSys_set.end(),&temp);//比较是否相等 比较的是地址!而不是内容...
//if(it == mSys_set.end()) return NULL;
return NULL;//找不到
}
//bool AddFriend()
private:
set<UserInfo*> mSys_set;
static const int Max_User = 200000;//最大好友数
};
///////
UserInfo* UserInfo::FindUser(char* name)//查找用户根据ID
{
return (*sysinfo).GetUser(name);//用到在后面才定义的方法,所以要在后面定义函数
}