类的自定义构造器 非动态分配内存情况 示例
本文地址: http://blog.csdn.net/caroline_wendy/article/details/14665719
除了动态分配内存时, 需要自定义构成器(析构器, 复制构造器, 复制-赋值构造器);
在一些特殊情况下, 也需要自定义构造器, 如在多对多的情况的.
例如: 一个信息可以放在多个文件夹下备份, 一个文件夹又可以包含多个信息;
则信息包含string类型的数据, 和文件夹类型地址的集合; 同理文件夹包含string类型的名字, 和信息类型的地址的集合;
注意: 自赋值时, 应该先删除地址, 再添加地址, 防止为空;
代码如下:
/* * cppprimer.cpp * * Created on: 2013.11.7 * Author: Caroline */ #include <iostream> class Message; class Folder { public: void addMsg(Message*); void remMsg(Message*); }; class Message { friend class Folder; public: explicit Message (const std::string &str = "" ) : contents(str) {} Message (const Message&); Message& operator= (const Message&); ~Message(); void save (Folder&); void remove (Folder&); private: std::string contents; std::set<Folder*> folders; //folder类型的指针 void add_to_Folders (const Message&); //把message添加至所有folder void remove_from_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) //删除私有成员变量folders集合的Message f->remMsg(this); } Message::Message(const Message& m) : contents (m.contents), folders (m.folders) { add_to_Folders (m); } Message::~Message() { remove_from_Folders (); } Message& Message::operator= (const Message &rhs) { remove_from_Folders(); contents = rhs.contents; folders = rhs.folders; add_to_Folders(rhs); return *this; return *this; } void swap (Message &lhs, Message &rhs) { using std::swap; for (auto f : lhs.folders) f->remMsg(&lhs); for (auto f : rhs.folders) f->remMsg(&rhs); swap(lhs.folders, rhs.folders); swap(lhs.contents, rhs.contents); for (auto f : lhs.folders) f->addMsg(&lhs); for (auto f : rhs.folders) f->addMsg(&rhs); } int main (void) { return 0; }
转载于:https://blog.51cto.com/spikeking/1388026