/* 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); }