行为像值的类
行为像指针的类
class HasPtr {
public:
HasPtr(const string& s = string()):ps(new string(s)),i(0),use(new size_t(1)){}
HasPtr(const HasPtr& p) : ps(p.ps), i(p.i), use(p.use) { ++* use; }
HasPtr& operator=(const HasPtr&);
HasPtr& operator=(const string&);
string& operator*() { return *ps; }
~HasPtr() { if (--*use == 0) { delete ps; delete use; } }
private:
string* ps;//指向ps的内容
int i;
size_t* use;//用来记录有多少个对象共享*ps对象
};
HasPtr& HasPtr::operator=(const HasPtr&rhs) {
if (this == &rhs) {
return *this;
}
++* rhs.use;
if (-- * use == 0) {
delete ps;
delete use;
}
ps = rhs.ps;
i = rhs.i;
use = rhs.use;
return *this;
}
HasPtr& HasPtr::operator=(const string& s) {
*ps = s;
return *this;
}
int main() {
HasPtr h("hi mom");
HasPtr h2 = h;
h = "hi dad!";
cout << "h: " << *h << endl;
cout << "h2: " << *h2 << endl;
}
课后习题那个还真的比较难
Message的设计
#include<vector>
#include<string>
#include<set>
class Message {
friend class Folder;
public:
explicit Message(const std::string & str = ""): contents(str){}
//拷贝控制成员
Message(const Message&);
Message& operator=(const Message&);
~Message();
//从给定Folder集合中添加/删除本Message
void save(Folder&);
void remove(Folder&);
private:
std::string contents; //实际的消息文本
std::set<Folder*> folder; //包含本Message的Folder
//拷贝构造函数,拷贝复制函数,和析构函数所使用的工具函数
//将本Message给添加到指向参数的Folder
void add_to_Folder(const Message&);
//从folders中的每个Folder中的删除本Message
void remove_from_Folders();
};
void Message::save(Folder& f) {
folder.insert(&f);
f.addMsg(this);
}
void Message::remove(Folder& f) {
folder.remove(&f);
f.remMsg(this);
}
void Message::add_to_Folder(const Message&m){
for (auto f : m.folder) {
f->addMsg(this);
}
}
Message::Message(const Message& m) : contents(m.contents),folder(m.folder){
add_to_Folder(m);
}
void Message::remove_from_Folders(){
for (auto f : folder) {
f->remMsg(this);
}
}
Message::~Message() {
remove_from_Folders();
}
Message& Message::operator=(const Message& rhs) {
remove_from_Folders();
contents = rhs.contents;
folder = rhs.folder;
add_to_Folder(rhs);
return *this;
}