c++ primer 消息处理示例+课后习题完成

最近又重新浏览了c++ primer , 感觉以前看的太浅显了,所以抽空又翻了翻,感觉里面很多的知识还是不是熟悉,正好今天看到复制控制这章的例题--消息处理示例,同时也把课后习题要求了顺带完成了。

贴一下代码,供大家参考,相互学习哈!

//Msg类
#ifndef MSG_H
#define MSG_H
#include "Folder.h"
#include <set>
#include <string>
using std::string;
using std::set;
class Msg
{
    //定义友元类
	friend class Folder;
public:
	//构造函数
	Msg(const string &str=""):content(str){}
	//复制构造函数
	Msg(const Msg&);
	//复制操作符
	Msg& operator=(const Msg&);
	~Msg();
	void save(Folder&);
	void remove(Folder&);
private:
	string content;
	set<Folder*> folders;
	//添加指向当前Msg对象的指针到Folder中
	void put_Msg_in_Folders(const set<Folder*>&);
	void remove_Msg_from_Folders();
	//当前的Msg对象添加/删除指向Folder的指针
	void addFldr(Folder*);
	void removeFldr(Folder*);
};
#endif

#include "Msg.h"
//复制构造函数
Msg::Msg(const Msg &m)
{
	//将Msg的成员进行赋值
	this->content = m.content;
	this->folders = m.folders;
	//将这个Msg添加到m所在的Folder中去
	put_Msg_in_Folders(this->folders);
}
void Msg::put_Msg_in_Folders(const set<Folder*> &rhs)
{
	for(set<Folder*>::const_iterator beg = rhs.begin();beg!=rhs.end();++beg)
		//将当前的Msg对象添加到每个Folder中
		(*beg)->addMsg(this);
}
Msg& Msg::operator=(const Msg &rhs)
{
	if(this != &rhs)
	{
		//将当前左边的Msg从它所在的Folder中全部移除
		remove_Msg_from_Folders();
		this->content=rhs.content;
		this->folders=rhs.folders;
		put_Msg_in_Folders(this->folders);
	}
	return *this;
}
void Msg::remove_Msg_from_Folders()
{
	for(set<Folder*>::const_iterator beg=folders.begin();beg!=folders.end();++beg)
	{
		(*beg)->removeMsg(this);
	}
}
Msg::~Msg(void)
{
	remove_Msg_from_Folders();
}

void Msg::addFldr(Folder *folder)
{
	folders.insert(folder);
}

void Msg::removeFldr(Folder *folder)
{
	folders.erase(folder);
}

void Msg::save(Folder &folder)
{
	//更新Msg对象中指向Folder指针集
	folders.insert(&folder);
	//更新Folder中指向Msg指针集
	folder.addMsg(this);
}

void Msg::remove(Folder &folder)
{
	//更新Msg对象中指向Folder指针集
	folders.erase(&folder);
	//更新Folder中指向Msg指针集
	folder.removeMsg(this);
}

//Folder类
#ifndef FOLDER_H
#define FOLDER_H
#include "Msg.h"
#include <set>
using std::set;
class Folder
{
	friend class Msg;
public:
	Folder();
	//复制构造函数
	Folder(const Folder&);
	Folder& operator=(const Folder&);
	~Folder();
	void save(Msg&);
	void remove(Msg&);
private:
	set<Msg*> messages;
	//复制mesages
	void copy_msg(const set<Msg*>&);
	void empty_msg();
	void addMsg(Msg*);
	void removeMsg(Msg*);
};
#endif

#include "Folder.h"
//Folder类的构造函数
Folder::Folder()
{
}

//Folder的复制构造函数,调用copy_msg()来复制f中指向Msg对象的指针
Folder::Folder(const Folder &f)
{
	copy_msg(f.messages);
}

//赋值操作符,先判断左右操作数是否相同,如果不同的话则清空左边Folder对象中指向Msg对象的指针
//并将右边rhs对象中指向Msg对象的指针复制给左边的对象
//最后返回*this
Folder& Folder::operator=(const Folder &rhs)
{
	if(this != &rhs)
	{
		empty_msg();
		this->copy_msg(rhs.messages);
	}
	return *this;
}
//Folder析构函数,清空Folder对象中所有的指向Msg对象的指针
Folder::~Folder()
{
	empty_msg();
}

//清空Folder对象中指向Msg对象的指针
//清空Folder对象指向Msg对象中指向Folder的指针
void Folder::empty_msg()
{
	//移除当前Folder中所有的指向Msg对象的指针
	for(set<Msg*>::iterator beg=messages.begin();beg!=messages.end();++beg)
	{
		//调用Msg类中的成员函数remove()来实现
		(*beg)->remove(*this);
	}
}

//复制操作
void Folder::copy_msg(const set<Msg*> &messages)
{
	for(set<Msg*>::const_iterator beg=messages.begin();beg!=messages.end();++beg)
	{
		//调用Msg类中的save操作来实现
		(*beg)->save(*this);
	}
}

//添加到当前Folder对象中指向Msg对象的指针集
void Folder::addMsg(Msg *msg)
{
	messages.insert(msg);
}

void Folder::removeMsg(Msg *msg)
{
	messages.erase(msg);
}

void Folder::save(Msg &msg)
{
	messages.insert(&msg);
	msg.addFldr(this);
}

void Folder::remove(Msg &msg)
{
	messages.erase(&msg);
	msg.removeFldr(this);
}

c++ primer 消息处理示例+课后习题完成

时间: 2024-11-12 08:54:13

c++ primer 消息处理示例+课后习题完成的相关文章

C++ Primer 学习笔记_56_类与数据抽象 --消息处理示例

复制控制 --消息处理示例 说明: 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message上有 save和 remove操作,用于在指定Folder中保存或删除该消息. 数据结构: 对每个Message,我们并不是在每个Folder中都存放一个副本,而是使每个Message保存一个指针集(set),set中

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

C Primer Plus 第十二章课后习题……2015.5.10

第十二章课后习题 1.自动存储 寄存器存储 静态空连接 2.静态空连接 内部链接 外部链接 3.静态外部链接  静态内部链接 4.空连接 5.在声明中使用表面这个变量或函数已经定义过 6.都分配一个具有100个int值的数组,calloc还把每个元素设置为零. 7.daisy全局变量  lily局部变量 8.#include<stdio.h> char color='B'; void first(void); void second(void); int main(void) { extern

C++Primer第五版——习题答案详解

开始刷<C++Primer>这本书,会在博客上更新课后习题. 水平有限,如有有误之处,希望大家不吝指教! 不断学习中,欢迎交流! 第一二章课后题 练习1.3 #include<iostream> int main(){ std::cout<<"Hello world"<<std::endl; return 0; } 练习1.4 #include<iostream> int main(){ std::cout <<

C++Primer第五版——习题答案目录

目前正在刷<C++Primer>这本书,会在博客上记录课后习题答案,答案仅供参考. 因为水平有限,如有有误之处,希望大家不吝指教,谢谢! 目录地址 使用的系统为:win 10,编译器:VS2017,答案用markdown写的. 第1章 开始&&第2章 变量和基本类型 ? 第3章 字符串.向量和数组 ? 第4章 表达式 ? 第5章 语句 ? 第6章 函数 ? 第7章 类 ? 第8章 IO库 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不断学习中,欢迎交流! 原文地址:

课后习题1-2章

第一章课后习题 (1) linux的发展史 Linux 操作系统的诞生创始人林纳斯·托瓦兹.发展和成长过程始终依赖着五 个重要支柱:UNIX 操作系统.MINIX 操作 系统.GNU计划.POSIX 标准 和Internet 网络. 1981 年IBM公司推出微型计算机IBM PC. 1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器 已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性, 实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linu

问题 1018: C语言程序设计教程(第三版)课后习题6.8

/******************************************************************** @file Main.cpp @date 2017-05-12 @author Zoro_Tiger @brief 问题 1018: C语言程序设计教程(第三版)课后习题6.8 http://www.dotcpp.com/oj/problem1018.html *************************************************

问题 1041: C语言程序设计教程(第三版)课后习题9.8

/******************************************************************** @file Main.cpp @date 2017-05-28 22:02:55 @author Zoro_Tiger @brief 问题 1041: C语言程序设计教程(第三版)课后习题9.8 http://www.dotcpp.com/oj/problem1041.html ****************************************

问题 1040: C语言程序设计教程(第三版)课后习题9.6

/******************************************************************** @file Main.cpp @date 2017-05-28 21:57:02 @author Zoro_Tiger @brief 问题 1040: C语言程序设计教程(第三版)课后习题9.6 http://www.dotcpp.com/oj/problem1040.html ****************************************