C++ Primer : 第十三章 : 拷贝控制示例
/* 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 : 第十三章 : 拷贝控制示例的更多相关文章
- C++ Primer : 第十三章 : 拷贝控制之对象移动
右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理
定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁
拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数 在我们没 ...
- [C++ Primer] : 第13章: 拷贝控制
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...
- 【C++ Primer 第十三章】4. 拷贝控制示例
拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> us ...
- 【c++ Prime 学习笔记】第13章 拷贝控制
定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将 ...
- 《C++ Primer》笔记 第13章 拷贝控制
拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么.拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么.析构函数定义了当此类型对象销毁时做什么.我们称这些操作为拷贝控制 ...
- C++Primer 第十三章
//1.当定义一个类时,我们显示地或隐式地指出在此类型的对象(注意这里是此类型的对象,而不包括此类型的指针)拷贝,移动,赋值,销毁时做什么.一个类通过定义五种特殊的成员函数来控制这些操作:拷贝构造函数 ...
- C++ Primer 5th 第13章 拷贝控制
当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.
随机推荐
- CentOS6.5 安装 jdk1.7
1.卸载centos自带的jdk # rpm -qa | grep java 结果大致为: tzdata-java-2012c-1.el6.noarch java-1.7.0-openjdk-1.7. ...
- z-index 应用简单总结
做过页面布局的同学对z-index属性应该是很熟悉了,z-index是针对网页显示中的一个特殊属性.因为显示器是显示的图案是一个二维平面,拥有x轴和y轴来表示位置属性.为了表示三维立体的概念如显示元素 ...
- Android 自定义波浪动画 --"让进度浪起来~"
原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...
- Java Performance - 如何调查解决 CPU 问题
随着硬件的发展,往往服务器会配置足够的 CPUs, Java Server/服务器不太有 CPU 问题:但是偶尔因为 代码海量循环 或者 线程安全性(thread safe), 还是会带来 CPU 问 ...
- 用substr()截取中文出现乱码的解决方法
截取中文字符串时出现乱码(使用substr()函数) 程序一:PHP截取中文字符串方法 function msubstr($str, $start, $len) { $tmpstr = &quo ...
- Poisson回归模型
Poisson回归模型也是用来分析列联表和分类数据的一种方法,它实际上也是对数线性模型的一种,不同点是对数线性模型假定频数分布为多项式分布,而泊松回归模型假定频数分布为泊松分布. 首先我们来认识一下泊 ...
- (AS3)关于arguments
一.官方说明 点击访问 二.使用心得 arguments包含了当前执行方法的参数,注意,不包含默认参数! arguments可以全局访问,可以在任何方法里访问,除此之外,在定义变量的时候或者初始化的时 ...
- html中input文本框,初始里边有文字提示,当点击时,文字消失,怎么设置?
使用onfocus事件检查当前值,如果是默认值,就将value属性置空.如:<input type="text" value="请输入内容" onfocu ...
- iOS开发UI篇—UITableview控件使用小结
iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...
- 【jQuery】serializeArray()与serialize()的区别
serialize()序列化表单元素为字符串,用于 Ajax 请求. serializeArray()序列化表单元素为JSON数据. 具体实例如下: 1 <!DOCTYPE html PUBLI ...