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章 拷贝控制
当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.
随机推荐
- 深入浅出设计模式——享元模式(Flyweight Pattern)
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...
- TCP连接的状态与关闭方式及其对Server与Client的影响
TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...
- 轻松解决Linux安装Eclipse方法
随着Linux的发展,很多人开始学习Linux系统,你了解Linux系统么?你是Linux系统的应用者么?本文为你详细介绍Linux安装Eclipse,为你在学习Linux安装Eclipse时起一定的 ...
- iOS - Library 库
1.动态库 & 静态库 什么是库: 库是程序代码的集合,是共享程序代码的一种方式.根据源代码的公开情况,库可以分为 2 种类型: 开源库: 公开源代码,能看到具体实现. 比如 SDWebIma ...
- linux top命令
top命令参数 -h:help表示显示帮助的意思 -v:version显示版本的意思,和-h的功能一样 -u:user显示指定用户的进程,例如:top -u root -p:pid显示指定进程,例如: ...
- [maven] maven变量
Maven内置变量说明: $${project.basedir}或{basedir} 项目根目录,即包含pom.xml文件的目录 ${project.version}或${version}表示项目版本 ...
- postgresql中执行计划
1.Explain explain select * from tablename; 2.explain输出josn格式 explain (format json) select * from tab ...
- 火狐 about:config
1. 允许脚本关闭页面 dom.allow_scripts_to_close_windows -> true 2. 不要显示图片 permissions.default.image -> ...
- mac xcworkspace xcodebuild
xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的 ...
- Java 并发和多线程(三) 多线程的代价 [转]
原文链接:http://tutorials.jenkov.com/java-concurrency/costs.html 作者:Jakob Jenkov 翻译:古圣昌 校对:欧振 ...