c++primer 复制控制-消息处理示例
---------文件夹类MyFolder.h
#pragma once
#ifndef MyFolder_H
#define MyFolder_H
#include <set>
class MyMessage;//这里的申明很重要。
class MyFolder
{
public:
MyFolder(void);
~MyFolder(void);
MyFolder(const MyFolder&);
MyFolder& operator=(const MyFolder&);
void AddMessage(MyMessage*);//文件中添加消息
void RemoveMessage(MyMessage*);//文件中删除消息
private:
std::set<MyMessage*> folderset;//消息集合
};
#endif
---------文件夹类实现MyFolder.cpp
#include "StdAfx.h"
#include "MyFolder.h"
#include "MyMessage.h"
#include <algorithm>
using namespace std;
//默认的构造函数
MyFolder::MyFolder(void)
{
}
//复制构造函数
MyFolder::MyFolder(const MyFolder &folder)
{
this->folderset=folder.folderset;
set<MyMessage*>::iterator iter=folder.folderset.begin();
while(iter!=folder.folderset.end())
{
(*iter)->AddFldr(this);
iter++;
}
}
//析构函数
MyFolder::~MyFolder(void)
{
set<MyMessage*>::iterator Messiter=this->folderset.begin();
while(Messiter!=this->folderset.end())
{
(*Messiter)->RemFldr(this);
Messiter++;
}
}
//重载=操作符
MyFolder& MyFolder::operator=(const MyFolder &folder)
{
this->folderset=folder.folderset;
if(&folder!=this)
{
set<MyMessage*>::iterator Messiter=this->folderset.begin();
while(Messiter!=this->folderset.end())
{
(*Messiter)->RemFldr(this);
Messiter++;
}
this->folderset=folder.folderset;
set<MyMessage*>::iterator iter=folder.folderset.begin();
while(iter!=folder.folderset.end())
{
(*iter)->AddFldr(this);
iter++;
}
}
return *this;
}
//添加消息
void MyFolder::AddMessage(MyMessage *message)
{
this->folderset.insert(message);
}
//删除消息
void MyFolder::RemoveMessage(MyMessage *message)
{
set<MyMessage*>::iterator deleiter=find(this->folderset.begin(),this->folderset.end(),message);
this->folderset.erase(deleiter);
}
---------消息类头文件MyMessage.h
#pragma once
#ifndef MYMESSAGE_H
#define MYMESSAGE_H
#include <string>
#include <set>
#include <algorithm>
#include "MyFolder.h"
class MyMessage
{
public:
MyMessage(void);//默认的构造函数
MyMessage(std::string);//带参数的构造函数
~MyMessage(void);//析构函数
MyMessage(const MyMessage&);//拷贝构造函数
void save(MyFolder&);//将消息保存到文件夹
void remove(MyFolder&);//将消息从一个文件夹移除
MyMessage& operator=(const MyMessage&);//赋值构造函数
void AddFldr(MyFolder*);
void RemFldr(MyFolder*);
private:
std::string messagecontent;//消息内容
std::set<MyFolder*> messageset;//保存消息所在folders指针
};
#endif
-------------消息类实现MyMessage.cpp
#include "StdAfx.h"
#include "MyMessage.h"
using namespace std;
//默认的构造函数
MyMessage::MyMessage(void):messagecontent(const std::string(""))
{
}
//析构函数
MyMessage::~MyMessage(void)
{
//从原来的文件夹中删除消息;remove_Msg_from_folders
set<MyFolder*>::iterator iter=this->messageset.begin();
while(iter!=this->messageset.end())
{
(*iter)->RemoveMessage(this);
iter++;
}
}
//带参数的构造函数
MyMessage::MyMessage(std::string message):messagecontent(message)
{
}
//拷贝构造函数
MyMessage::MyMessage(const MyMessage &message)
{
messagecontent=message.messagecontent;
this->messageset.clear();
this->messageset.insert(message.messageset.begin(),message.messageset.end());
//和书上的put_Msg_in_folder一样的意思
set<MyFolder*>::iterator iter=message.messageset.begin();
while(iter!=message.messageset.end())
{
(*iter)->AddMessage(this);
iter++;
}
}
//赋值构造函数
MyMessage& MyMessage::operator=(const MyMessage &message)
{
if(&message!=this)//这个不是必须的,但是如果碰上自己给自己赋值的情况效率会高很多,应该加上。
{
messagecontent=message.messagecontent;
//从原来的文件夹中删除消息;remove_Msg_from_folders
set<MyFolder*>::iterator iter=this->messageset.begin();
while(iter!=this->messageset.end())
{
(*iter)->RemoveMessage(this);
iter++;
}
//将消息添加到现在的文件夹中;put_Msg_in_folders
set<MyFolder*>::iterator folderiter=message.messageset.begin();
while(folderiter!=message.messageset.end())
{
(*iter)->AddMessage(this);
folderiter++;
}
//清除原来的文件夹集
this->messageset.clear();
//添加新的文件夹集
this->messageset.insert(message.messageset.begin(),message.messageset.end());
}
return *this;
}
void MyMessage::save(MyFolder &folder)
{
//消息对应的文件夹set中添加
this->messageset.insert(&folder);
//folder中添加message
folder.AddMessage(this);
}
void MyMessage::remove(MyFolder &folder)
{
//folder中移除message
folder.RemoveMessage(this);
//消息对应的文件夹set中移除
set<MyFolder*>::iterator deleiter=find(this->messageset.begin(),this->messageset.end(),&folder);
this->messageset.erase(deleiter);
}
//添加消息到文件夹
void MyMessage::AddFldr(MyFolder* folder)
{
this->messageset.insert(folder);
}
//从文件夹删除消息
void MyMessage::RemFldr(MyFolder *folder)
{
set<MyFolder*>::iterator deleiter=find(this->messageset.begin(),this->messageset.end(),folder);
this->messageset.erase(deleiter);
}