C++ //练习 13.36 设计并实现对应的Folder类。此类应该保存一个指向Folder中包含的Message的set。

server/2024/9/25 3:07:52/

C++ Primer(第5版) 练习 13.36

练习 13.36 设计并实现对应的Folder类。此类应该保存一个指向Folder中包含的Message的set。

环境:Linux Ubuntu(云服务器)
工具:vim

 

代码块
/*************************************************************************> File Name: ex13.36.cpp> Author: > Mail: > Created Time: Thu 25 Apr 2024 09:28:32 AM CST************************************************************************/#include<iostream>
using namespace std;class Folder;class Messsage{friend class Folder;friend void swap(Message &lhs, Message &rhs);public:explicit Message(const string &str = ""): contents(str) {}Message(const Message &);Message &operator= (const Message &);~Message();void save(Folder &);void remove(Folder &);private:string contents;set<Folder*> folders;void addFolder(Folder *);void remFolder(Folder *);void add_to_Folders(const Message &);void remove_from_Folders();
};Message::Message(const Message &m): contents(m.contents), folders(m.folders){add_to_Folders(m);
}Message &Message::operator= (const Message &rhs){remove_from_Folders();contents = rhs.contents;folders = rhs.folders;add_to_Folders(rhs);return *this;
}Message::~Message(){remove_from_Folders();
}void Message::save(Folder &f){folders.insert(&f);f.addMsg(this);
}void Message::remove(Folder &f){folders.erase(&f);f.remMsg(this);
}void Message::addFolder(Folder *f){folders.insert(f);
}void Message::remFolder(Folder *f){folders.erase(f);
}void Message::add_to_Folders(const Message &m){for(auto f : m.folders){f->addMsg(this);}
}void Message::remove_from_Folders(){for(auto f : folders){f->remMsg(this);}
}void swap(Messsage &lhs, Messsage &rhs){using std::swap;for(auto f : lhs.folders){f->remMsg(&lhs);}for(auto f : rhs.folders){f->remMsg(&rhs);}swap(lhs.folders, rhs.folders);swap(lhs.contents, rhs.contents);for(auto f : lhs.folders){f->addMsg(&lhs);}for(auto f : rhs.folders){f->addMsg(&rhs);}
}class Folder{friend class Message;friend void swap(Message &, Message &);public:Folder() = default;Folder(const Folder &);Folder &operator= (const Folder &);~Folder();private:set<Message*> msgs;void addMsg(Message *);void remMsg(Message *);void add_to_Messages(const Folder &);void remove_to_Messages();
};Folder::Folder(const Folder &f){add_to_Messages(f);
}Folder& Folder::operator= (const Folder &f){remove_to_Messages();msgs = f.msgs;add_to_Messages(f);return *this;
}Folder::~Folder(){remove_to_Messages();
}void Folder::addMsg(Message *m){msgs.insert(m);
}void Folder::remMsg(Message *m){msgs.erase(m);
}void Folder::add_to_Messages(const Folder &f){for(auto m : f.msgs){m->addFolder(this);}
}void Folder::remove_from_Message(){for(auto m : msgs){m->remFolder(this);}
}

http://www.ppmy.cn/server/14734.html

相关文章

12.7.1 实验7:实施路由器密码恢复

1、实验目的 通过本实验可以掌握&#xff1b; 路由器密码恢复原理。路由器密码恢复步骤。修改配置寄存器值的方法。 2、实验步骤 路由器密码恢复的过程如下所述。 &#xff08;1&#xff09;路由器冷启动。 1分钟内按【CtrlBreak】键进入ROM监控(ROM Monitor ) rommon模式…

Linux第六章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

windows上运行bitsandbytes报错

(大语言模型) transformers 目前支持两种量化方式&#xff1a;bitsandbytes 和 autogptq 一、报错信息 bin C:\Users\win10\anaconda3\envs\qlora\Lib\site-packages\bitsandbytes\libbitsandbytes_cpu.so False C:\Users\win10\anaconda3\envs\qlora\Lib\site-packages\bitsa…

MySQL数据库SSL连接测试

环境信息&#xff1a;Centos7 MySQL 5.7.21 在该环境上进行SSL连接测试。 MySQL Server 配置&#xff1a; vi /etc/my.cnf [mysql] default-character-set utf8mb4[client] default-character-set utf8mb4# ssl_mode [ DISABLED | PREFERRED(default if not set) | REQ…

openEuler 22.03 LTS SP3(华为欧拉)一键安装 Oracle 12CR2 RAC(220118) 数据库

前言 Oracle 一键安装脚本&#xff0c;演示 openEuler 22.03 LTS SP3 一键安装 Oracle 12CR2 RAC&#xff08;220118&#xff09; 过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载…

亚马逊云科技提高企业生产力神器Amazon Q评测分析

一年一度的全球云计算春晚&#xff0c;亚马逊云科技Re:invent在2023年11月27于Vegas震撼来袭&#xff0c;其中最令人关注的就是CEO Adam在Keynote中分享的内容。其中一个新内容就是提升生产力神器: Amazon Q&#xff0c;可以说它重新定义了企业的工作模式。那具体它神在哪里呢&…

Android Binder——Java层通信实例(十六)

前面的文章中我们介绍了 Java 层服务的注册流程,以及代理文件的查找。这里我们看一个 Binder 通信的实例,为了方便我们就以 Android 源码中现有的功能 PMS 的 install 为例,PMS 在进行 APK 安装时,会进行 dex 的翻译,依赖守护进程 installd 完成。 一、源码分析 1. AIDL…

springboot基于点餐码 二维码在线点餐系统vue.js+java

Maven: 项目管理和构建自动化工具&#xff0c;用于java项目。 java: 广泛使用的编程语言&#xff0c;适用于构建跨平台应用。 Springmvc:从而在使用Spring进行WEB开发时&#xff0c;可以选择使用Spring的Spring MVC框架。 MyBatis: java持久层框架&#xff0c;支持定制化SQL、存…