因为这个类的设计涉及到了拷贝构造函数和重载赋值操作符。下面把这个类的实现代码贴出来(有些方法没有实现):
#include <iostream>
#include <set>
using namespace std;
class Message;
class Folder {
friend class Message;
public:
private:
set<Message *> messages;//指向消息的指针集
};
//思考:为什么必须要定义拷贝构造函数和重载赋值操作符.原因很简单,因为合成的拷贝构造函数已经不能满足要求了。
//今后要考虑逐个成员的赋值是否能满足要求;当不能满足要求时,要自己定义这两个函数
class Message {
public:
//默认的构造函数
Message(const string &s = " "): content(s) {}
//拷贝构造函数(给未初始化的Message初始化)
Message(const Message &mess):content(mess.content), folders(mess.folders) {
putMessageInFolder();
}
//重载赋值操作符
Message& operator=(const Message &mess);
~Message() {
removeMessageFromFolder();
}
//将message放入指定的folder
void save(Folder&);
void remove(Folder&);
private:
string content;
set<Folder *> folders;//指向文件夹的指针集
//定义这两个函数为private类型
void putMessageInFolder() {
for(set<Folder *>::iterator iter = folders.begin(); iter != folders.end(); ++iter)
(*iter)->messages.insert(this);
}
void removeMessageFromFolder() {
for(set<Folder *>::iterator iter = folders.begin(); iter != folders.end(); ++iter)
(*iter)->messages.erase(this);
}
};
Message& Message::operator=(const Message &mess) {
if(content != mess.content) {//如果不加此判断条件,若两者相等,则会把相同的删除掉
removeMessageFromFolder();
content = mess.content;
folders = mess.folders;
putMessageInFolder();
}
return *this;
}
int main()
{
return 0;
}
总结:要思考为什么要这样设计?为什么要定义拷贝构造函数和重载的赋值操作符?为什么把一些类定义为private?还有几个程序的小细节,思考为什么这样做,不这样做行不行?要不断的优化代码。