/* 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. jquery mobile的事件

    有个问题困扰了我两天,知道今天才解决. 那就是page的pagecreate事件,只调用一次 如果想随时更新,就要调用pageshow事件,每次都会调用, 这个事情再次告诉我,基础要扎实啊,不然会浪费 ...

  2. 基础笔记4(包装类,时间date. calendar

    1.包装类 基本类型和对象. 编译器会对基本类型和包装类进行自动拆箱,装箱处理 Interger  i=5; int i=new Interger(4); 一个缓存问题:以便提高效率 integer ...

  3. jquery截图插件的使用

    首先感谢http://www.htmleaf.com/Demo/201504211717.html这款插件. 使用之初,对于插件的结构很是糊涂,首先文件的核心是cropper.js,其次才是mian. ...

  4. STM32学习笔记(九) 外部中断,待机模式和事件唤醒

    学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为 ...

  5. hdu 5542 The Battle of Chibi(2015CCPC - C题)

    题目链接:hdu 5542 首届CCPC的C题,比赛时一起搞了好久,最后是队友A出的,当时有试过用树状数组来优化 dp,然后今天下午也用树状数组搞了一下午,结果还是踩了和当时一样的坑:我总是把用来记录 ...

  6. nginx+tomcat 配置负载均衡

    nginx 从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(我用的是nginx-1.8.1版本) 安装就直接把压缩包解压到一个路径 ...

  7. cxf笔记记录

    一.Web Service框架介绍: 1. WebService框架的作用: -- WebService只是一种思想,不是一个具体的框架. -- 它也是javaEE的规范. -- 它可以跨平台(操作平 ...

  8. oracle中如何创建dblink

    当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据.下面讲介绍如何在本地数 ...

  9. spring随手笔记4:ref的属性

    1.local属性 引用在同一个xml的bean           只能引用bean的id <bean id="HelloWord" class="com.ltf ...

  10. URAL 2080 Wallet 莫队算法

    题目链接:Wallet 题意:给出n张卡片,k次使用.要求每次使用的卡片都在最上面.首先希望你合理的安排每张卡片的初始位置,并且输出.然后,问每次使用完卡片之后插入的位置上面有几张卡片,才能使得每次使 ...