《c++primer(第四版)》习题13.16

#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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值