/* Message.h */

#ifndef _MESSAGE_H_
#define _MESSAGE_H_ #include <iostream>
#include <string>
#include <set> class Folders; class Message {
friend class Folders; public:
// Default Constructor
explicit Message (const std::string& str = "") : contests (str){}
// Copy Constructor
Message(const Message&);
// Copy Assignment function
Message& operator = (const Message&); // add this Messageto a Folder or remove from this Message from Folder
void save (Folders&);
void remove (Folders&); void swap (Message&, Message&); std::string& getMsgName (){ return contests; } ~Message (); private: std::string contests; // message std::set<Folders*> folders; // save the folders that include this message void add_to_Folders (const Message&);
void remove_from_Folders (); }; #endif // _MESSAGE_H_

/* Message.cpp */

#include "Message.h"

// Copy Constructor
Message::Message (const Message& msg) : contests (msg.contests), folders (msg.folders){ add_to_Folders(msg);
} Message::~Message (){ remove_from_Folders();
} // Copy Assignment
Message& Message::operator=(const Message& msg){ remove_from_Folders();
contests = msg.contests;
folders = msg.folders;
add_to_Folders(msg);
return *this;
} void Message::save (Folders& f){ folders.insert(&f);
f.addMsg(this);
} void Message::remove (Folders& f){ folders.erase (&f);
f.removeMsg(this);
} inline
void Message::add_to_Folders (const Message& msg){ for (auto f : msg.folders)
f->addMsg(this);
} inline
void Message::remove_from_Folders (){ for (auto f : folders)
f->removeMsg(this); }
/* Folders.h */

#ifndef _FOLDERS_H_
#define _FOLDERS_H_ #include <string>
#include <set> class Message; class Folders { friend class Message;
public: explicit Folders (const std::string& fld = "") : folderName (fld){}
~Folders (); Folders (const Folders&); Folders& operator = (const Folders&); void addToMsg (const Folders&);
void rmFromMsg (); //
void addMsg (Message*);
void removeMsg (Message*); std::string& getFldName (){ return folderName; } private: std::string folderName; std::set<Message*> message;
}; #endif // _FOLDERS
#include "Folders.h"

Folders::Folders (const Folders& f) : folderName(f.folderName), message(f.message){

	addToMsg(f);

}

Folders::~Folders (){

	rmFromMsg();

}

Folders& Folders::operator=(const Folders& f){

	rmFromMsg();
folderName = f.folderName;
message = f.message;
addToMsg(f);
return *this;
} void Folders::addToMsg (const Folders& fld){ for (auto m : fld.message)
m->save (*this); } void Folders::rmFromMsg (){ for (auto m : message)
m->remove(*this); } void Folders::addMsg (Message* msg){ message.insert(msg); } void Folders::removeMsg (Message* msg){ message.erase (msg);
}

C++ Primer : 第十三章 : 拷贝控制示例的更多相关文章

  1. C++ Primer : 第十三章 : 拷贝控制之对象移动

    右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...

  2. C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理

    定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...

  3. C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁

    拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没 ...

  4. [C++ Primer] : 第13章: 拷贝控制

    拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...

  5. 【C++ Primer 第十三章】4. 拷贝控制示例

    拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> us ...

  6. 【c++ Prime 学习笔记】第13章 拷贝控制

    定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将 ...

  7. 《C++ Primer》笔记 第13章 拷贝控制

    拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么.拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么.析构函数定义了当此类型对象销毁时做什么.我们称这些操作为拷贝控制 ...

  8. C++Primer 第十三章

    //1.当定义一个类时,我们显示地或隐式地指出在此类型的对象(注意这里是此类型的对象,而不包括此类型的指针)拷贝,移动,赋值,销毁时做什么.一个类通过定义五种特殊的成员函数来控制这些操作:拷贝构造函数 ...

  9. C++ Primer 5th 第13章 拷贝控制

    当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.

随机推荐

  1. GITHUB使用简介

    前提:本地开通SSH服务  我是Ubuntu OS,其他OS自行查找,不难目的:利用Github的免费托管服务,创建自己的repo或者fork别人的repo.步骤:·安装客户端  安装如下两个git  ...

  2. IIS 7中 ISAPI 错误解决

    在本地IIS种发布了一个测试网站,浏览的时候提示 404 错误,无法显示页面,具体错误如下: 解决办法如下: 选择IIS根目录,在右边的功能视图中选择 “ISAPI 和 CGI限制”,双击打开, 把相 ...

  3. zookeeper第二课 客户端的简单命令

    zookeeper的每个节点既可以是目录也可以是文件,节点上只存一些协调数据(状态.配置.位置),单位一般是KB,大部分数据用sdfs上 只有持久化的节点才可以有子节点,临时节点不可以有自子节点. 客 ...

  4. (二)Kafka动态增加Topic的副本(Replication)

    (二)Kafka动态增加Topic的副本(Replication) 1. 查看topic的原来的副本分布 [hadoop@sdf-nimbus-perf ~]$ le-kafka-topics.sh ...

  5. 《BI那点儿事》数据流转换——聚合

    聚合转换可以像T-SQL中的函数GROUP BY, Average, Minimum, Maximum, 和 Count一样对数据进行聚合运算.在图中可以看到数据以SampleID分组,对TotalS ...

  6. TCP连接的状态与关闭方式及其对Server与Client的影响

    TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...

  7. Delphi TTable 组件

    TTable 是 TDataSet 的派生类,它是基于 BDE 数据库引擎的数据集组件,也是一个较简单的数据组件,可以直接从数据库中获取数据表的数据,只需设置连接的数据库属性(Database) 和所 ...

  8. [css]【转载张鑫旭】我是如何对网站CSS进行架构的

    一.写在前面的 都是自己积累形成的一些东西,可能带有明显的个人印记.不是专业内容,不是权威指南,只是展示一点自己的观点,借此希望能与各位优秀的同行交流看法,见解.以得到进步与提高. 二.我所知的一些过 ...

  9. [Java基础]循环结构3

    [Java基础]循环结构3 break 与 continue 中断循环... /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:BreakTest.java 编写时间:2016/6 ...

  10. [SoapUI] JDBC 请求连接SQL Sever,MySQL

    MySQLDriver: com.mysql.jdbc.DriverConnection string: jdbc:mysql://localhost:3306/xxx?user=xxx&pa ...