类的自定义构造器 非动态分配内存情况 示例

 

本文地址: 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;  }