c++primer 复制控制-消息处理示例

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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值