类的自定义构造器 非动态分配内存情况 示例
本文地址: 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;
}