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

来源:互联网 发布:js 模拟dos 编辑:程序博客网 时间:2024/06/06 18:57

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

 

本文地址: 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添加至所有foldervoid 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集合的Messagef->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;}


原创粉丝点击