C++笔记 13.4 拷贝控制示例

primer C++笔记

拷贝控制示例

在这里插入图片描述
在这里插入图片描述

class Folder
{
	friend class Message;
public:
	void addMsg(Message *);
	void remMsg(Message *);
};

class Message
{
	friend class Folder;
	friend void swap(Message& lhs, Message& rhs);
public:
	explicit Message(const string& str = string())
		:contents(str) {}
	Message(const Message&);
	Message& operator=(const Message&);
	~Message();

	void save(Folder &);
	void remove(Folder &);
private:
	void add_to_folders(const Message& );
	void remove_from_folders();

	string contents;
	set<Folder*> 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::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);
	}
}

Message::~Message()
{
	remove_from_folders();
}

Message::Message(const Message& m)
	:contents(m.contents), folders(m.folders)
{
	add_to_folders(m);
}

Message& Message::operator=(const Message& m)
{
	remove_from_folders();
	contents = m.contents;
	folders = m.folders;
	add_to_folders(m);
}

void swap(Message& lhs, Message& rhs)
{
	for ( auto f : lhs.folders )
	{
		f->remMsg(&lhs);
	}
	for (auto f : rhs.folders)
	{
		f->remMsg(&rhs);
	}
	
	using std::swap;
	swap(lhs.contents, rhs.contents);
	swap(lhs.folders, rhs.folders);

	for (auto f : lhs.folders)
	{
		f->addMsg(&lhs);
	}
	for (auto f : rhs.folders)
	{
		f->addMsg(&rhs);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值