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 課後習題解析C++
- 《C++ Primer》 P415 訊息處理機制 原始碼C++原始碼
- C++ BUILDER 訊息處理的深入探索 (轉)C++UI
- 如何處理RabbitMQ 訊息堆積和訊息丟失問題MQ
- WCF後傳系列(10):訊息處理功能核心
- IOS 訊息推送處理iOS
- php ActiveMQ的傳送訊息,與處理訊息PHPMQ
- MPLS RSVP訊息處理——VecloudCloud
- Storm保證訊息處理ORM
- 三、訊息的可靠處理
- .net core 訊息流處理流程
- VCL中訊息處理初探 (轉)
- Kafka叢集訊息積壓問題及處理策略Kafka
- 處理鍵盤輸入訊息(轉)
- C#的訊息處理方法 (轉)C#
- python課後習題Python
- java課後題複習Java
- windows批處理教程-黃棒清-專題視訊課程Windows
- 史丹佛自然語言處理習題課1——緒論自然語言處理
- 如何處理Docker的錯誤訊息request canceled:Docker代理問題Docker
- 處理檔案上傳時的訊息格式轉換問題
- 【實戰教程】微信卡券訊息處理
- Go 語言的錯誤訊息處理Go
- Storm基礎(四)保證訊息處理ORM
- 使用 Java API 處理 WebSphere MQ 大訊息JavaAPIWebMQ
- 《C++ Primer》學習筆記(五):迴圈、分支、跳轉和異常處理語句C++筆記
- Spring Ioc原始碼分析系列--Ioc容器註冊BeanPostProcessor後置處理器以及事件訊息處理Spring原始碼Bean事件
- 請教mina處理訊息?需要建立訊息佇列?佇列
- Java課後習題總結Java
- oracle的訊息簡單示例Oracle
- C++ Primer 第二章 學習筆記及習題答案C++筆記
- 訊息中介軟體消費到的訊息處理失敗怎麼辦?
- 原始碼分析:Android訊息處理機制原始碼Android
- Android應用程式訊息處理機制Android
- 如何處理錯誤訊息PleaseinstalltheLinuxkernelheaderfilesLinuxHeader
- Cloud Foundry架構和訊息處理機制Cloud架構
- Laravel 實現 Kafka 訊息推送與接收處理LaravelKafka
- Handler訊息處理機制原始碼解析 上原始碼