#include <iostream>
#include <string>
#include <set>
using namespace std;
class Message;
class Folder
{
public:
Folder(const std::string& arg):path(arg)
{}
~Folder();
void add(const Message&);
void del(const Message&);
friend ostream& operator<<(ostream& out, Folder& f);
std::string getPath()
{
return path;
}
private:
private:
void removeAllMessage();
std::string path;
std::set<Message*> messages;
};
class Message
{
public:
Message(const string& arg = "");
Message(const Message&);
~Message();
void save(const Folder&);
void remove(const Folder&);
Message& operator=(const Message&);
friend ostream& operator<<(ostream& out, Message& m);
string getContent()
{
return content;
}
private:
void putMsgIntoFolders(const set<Folder*>&);
void removeMsgFromFolders();
private:
string content;
set<Folder*> folders;
};
void Folder::add(const Message& arg)
{
if(messages.find(const_cast<Message*>(&arg)) == messages.end())
{
messages.insert(const_cast<Message*>(&arg));
}
else
{
cout<<"message already in folder"<<endl;
}
return;
}
void Folder::del(const Message& arg)
{
if(messages.find(const_cast<Message*>(&arg)) != messages.end())
{
messages.erase(const_cast<Message*>(&arg));
}
else
{
cout<<"message not in folder"<<endl;
}
}
ostream& operator<<(ostream& out, Folder& f)
{
out<<"Folder path is: "<<f.path<<" has "<<f.messages.size()<<" messages"<<endl;
set<Message*>::const_iterator it = f.messages.begin();
while(it != f.messages.end())
{
out<<"has message: "<<(*it)->getContent()<<endl;
it++;
}
return out;
}
void Folder::removeAllMessage()
{
std::set<Message*>::iterator it = messages.begin();
while(it!= messages.end())
{
(*it)->remove(*this);
it++;
}
}
Folder::~Folder()
{
removeAllMessage();
}
Message::Message(const string& arg):content(arg)
{
}
Message::Message(const Message& arg)
{
*this = arg;
}
Message::~Message()
{
removeMsgFromFolders();
}
void Message::save(const Folder& arg)
{
if(folders.find(const_cast<Folder*>(&arg)) == folders.end())
{
folders.insert(const_cast<Folder*>(&arg));
}
else
{
cout<<"Message has that folder to add"<<endl;
}
const_cast<Folder*>(&arg)->add(*this);
return;
}
void Message::remove(const Folder& arg)
{
if(folders.find(const_cast<Folder*>(&arg)) != folders.end())
{
folders.erase(const_cast<Folder*>(&arg));
}
else
{
cout<<"Message do not have that folder to delete"<<endl;
}
}
Message& Message::operator =(const Message& arg)
{
removeMsgFromFolders();
this->content = arg.content;
this->folders = arg.folders;
putMsgIntoFolders(this->folders);
return *this;
}
void Message::putMsgIntoFolders(const set<Folder*>& arg)
{
set<Folder*>::const_iterator it = arg.begin();
while(it != arg.end())
{
(*it)->add(*this);
it++;
}
}
void Message::removeMsgFromFolders()
{
set<Folder*>::const_iterator it = folders.begin();
while(it != folders.end())
{
(*it)->del(*this);
it++;
}
return;
}
ostream& operator<<(ostream& out, Message& m)
{
out<<"Message content is: "<<m.content<<endl;
set<Folder*>::const_iterator it = m.folders.begin();
while(it != m.folders.end())
{
out<<"in Folder "<<(*it)->getPath()<<endl;
it++;
}
return out;
}
void fun_1316()
{
Message m1("Message1");
Message m2;
Message m3("Message3");
Folder f1("c:\\f1");
Folder f2("c:\\f2");
m1.save(f1);
m1.save(f2);
m3.save(f2);
// m1.show();
// f1.show();
m2 = m1;
m2 = m3;
cout<<m3;
cout<<f1;
cout<<f2;
}
《c++primer(第四版)》习题13.16
最新推荐文章于 2018-11-27 18:43:48 发布