拷贝控制示例

 #include<iostream>
#include<string>
#include<set>
#include<vector>
using namespace std; class Folder; class Message {
friend void swap(Message&, Message&);
friend class Folder;
public:
explicit Message(const string &str = "") : contents(str) {}
Message(const Message&);
Message& operator=(const Message&);
~Message(); Message(Message&&);
Message& operator=(Message&&); void save(Folder&);
void remove(Folder&);
void debug_print(); private:
string contents;
set<Folder*> folders; void add_to_Folders(const Message&);
void remove_from_Folders();
void addFldr(Folder *f) { folders.insert(f); }
void remFldr(Folder *f) { folders.erase(f); }
void move_Folders(Message*);
}; /*------------------------------------------------------------------------------------------------------*/ class Folder {
friend void swap(Message&, Message&);
friend class Message;
public:
Folder() = default;
Folder(const Folder&);
Folder& operator=(const Folder&); Folder(Folder&&);
Folder& operator=(Folder&&);
~Folder(); void save(Message&);
void remove(Message&);
void debug_print(); private:
set<Message*> msgs; void add_to_Messages(const Folder&);
void remove_from_Msgs();
void addMsg(Message *m) { msgs.insert(m); }
void remMsg(Message *m) { msgs.erase(m); }
void move_Messages(Folder*); }; /*---------------------------------------Folder类成员函数--------------------------------------------------*/ Folder::Folder(const Folder &f) : msgs(f.msgs)
{
add_to_Messages(f);
} void Folder::add_to_Messages(const Folder &f)
{
for (auto msg : f.msgs)
msg->addFldr(this);
} Folder& Folder::operator=(const Folder &f)
{
remove_from_Msgs();
msgs = f.msgs;
add_to_Messages(f);
return *this;
} void Folder::remove_from_Msgs()
{
while (!msgs.empty())
(*msgs.begin())->remove(*this); // Message类成员函数
} Folder::~Folder()
{
remove_from_Msgs();
} Folder::Folder(Folder &&f)
{
move_Messages(&f);
} void Folder::move_Messages(Folder *f)
{
msgs = std::move(f->msgs);
f->msgs.clear();
for (auto m : msgs)
{
m->remFldr(f);
m->addFldr(this);
}
} Folder& Folder::operator=(Folder &&f)
{
if (this != &f)
{
remove_from_Msgs();
move_Messages(&f);
}
return *this;
} void Folder::save(Message &m)
{
msgs.insert(&m);
m.addFldr(this);
} void Folder::remove(Message &m)
{
msgs.erase(&m);
m.remFldr(this);
} void Folder::debug_print()
{
cerr << "Folder contains " << msgs.size() << " messages" << endl;
int ctr = ;
for (auto m : msgs)
{
cerr << "Message " << ctr++ << ":\n\t" << m->contents << endl;
}
} /*---------------------------------------Message类成员函数------------------------------------------------*/ Message::Message(const Message &m) : contents(m.contents), folders(m.folders)
{
add_to_Folders(m);
} void Message::add_to_Folders(const Message &m)
{
for (auto f : m.folders)
f->addMsg(this); // Folder类成员函数
} Message& Message::operator=(const Message &rhs)
{
remove_from_Folders();
contents = rhs.contents;
folders = rhs.folders;
add_to_Folders(rhs);
return *this;
} void Message::remove_from_Folders()
{
for (auto f : folders)
f->remMsg(this);
folders.clear();
} Message::Message(Message &&m) : contents(std::move(m.contents))
{
move_Folders(&m);
} void Message::move_Folders(Message *m)
{
folders = std::move(m->folders);
for (auto f : folders)
{
f->remMsg(m);
f->addMsg(this);
}
m->folders.clear();
} Message& Message::operator=(Message &&rhs)
{
if (this != &rhs)
{
remove_from_Folders();
contents = std::move(rhs.contents);
move_Folders(&rhs);
}
return *this;
} Message::~Message()
{
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::debug_print()
{
cerr << "Message:\n\t" << contents << endl;
cerr << "Appears in " << folders.size() << " Folders" << endl;
} 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()
{
string s1("contents1");
string s2("contents2");
string s3("contents3");
string s4("contents4");
string s5("contents5");
string s6("contents6");
Message m1(s1);
Message m2(s2);
Message m3(s3);
Message m4(s4);
Message m5(s5);
Message m6(s6); Folder f1;
Folder f2; m1.save(f1); m3.save(f1); m5.save(f1);
m1.save(f2); m2.save(f2); m4.save(f2);
m6.save(f2); m1.debug_print();
f2.debug_print(); Message c1(m1);
Message c2(m2), c4(m4), c6(m6); m1.debug_print();
f2.debug_print(); m2 = m3;
m4 = m5;
m6 = m3;
m1 = m5; m1.debug_print();
f2.debug_print(); m2 = m2;
m1 = m1; m1.debug_print();
f2.debug_print(); vector<Message> vm;
cout << "capacity: " << vm.capacity() << endl;
vm.push_back(m1); cout << "capacity: " << vm.capacity() << endl;
vm.push_back(m2); cout << "capacity: " << vm.capacity() << endl;
vm.push_back(m3); cout << "capacity: " << vm.capacity() << endl;
vm.push_back(m4); cout << "capacity: " << vm.capacity() << endl;
vm.push_back(m5); cout << "capacity: " << vm.capacity() << endl;
vm.push_back(m6); vector<Folder> vf;
cout << "capacity: " << vf.capacity() << endl;
vf.push_back(f1); cout << "capacity: " << vf.capacity() << endl;
vf.push_back(f2); cout << "capacity: " << vf.capacity() << endl;
vf.push_back(Folder(f1)); cout << "capacity: " << vf.capacity() << endl;
vf.push_back(Folder(f2)); cout << "capacity: " << vf.capacity() << endl;
vf.push_back(Folder()); Folder f3;
f3.save(m6);
cout << "capacity: " << vf.capacity() << endl;
vf.push_back(f3);
return ;
}

运行结果:

Message:
contents1
Appears in Folders
Folder contains messages
Message :
contents6
Message :
contents4
Message :
contents2
Message :
contents1
Message:
contents1
Appears in Folders
Folder contains messages
Message :
contents6
Message :
contents4
Message :
contents2
Message :
contents1
Message :
contents6
Message :
contents4
Message :
contents2
Message :
contents1
Message:
contents5
Appears in Folders
Folder contains messages
Message :
contents6
Message :
contents4
Message :
contents2
Message :
contents1
Message:
contents5
Appears in Folders
Folder contains messages
Message :
contents6
Message :
contents4
Message :
contents2
Message :
contents1
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
capacity:
请按任意键继续. . .

【C++ Primer 第十三章】4. 拷贝控制示例的更多相关文章

  1. C++ Primer : 第十三章 : 拷贝控制之对象移动

    右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...

  2. C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理

    定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...

  3. C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁

    拷贝构造函数 一个构造函数的第一个参数是自身类类型的引用,额外的参数(如果有)都有默认值,那么这个构造函数是拷贝构造函数.拷贝构造函数的第一个参数必须是一个引用类型. 合成的拷贝构造函数   在我们没 ...

  4. C++Primer 第十三章

    //1.当定义一个类时,我们显示地或隐式地指出在此类型的对象(注意这里是此类型的对象,而不包括此类型的指针)拷贝,移动,赋值,销毁时做什么.一个类通过定义五种特殊的成员函数来控制这些操作:拷贝构造函数 ...

  5. 【C++ Primer | 15】构造函数与拷贝控制

    合成拷贝控制与继承 #include <iostream> using namespace std; class Base { public: Base() { cout << ...

  6. C++ Primer : 第十三章 : 拷贝控制示例

    /* Message.h */ #ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include <iostream> #include <strin ...

  7. C++ Primer : 第十三章 : 动态内存管理类

    /* StrVec.h */ #ifndef _STRVEC_H_ #define _STRVEC_H_ #include <memory> #include <string> ...

  8. [C++ Primer] : 第13章: 拷贝控制

    拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...

  9. 【C++】《C++ Primer 》第十三章

    第十三章 拷贝控制 定义一个类时,需要显式或隐式地指定在此类型地对象拷贝.移动.赋值和销毁时做什么. 一个类通过定义五种特殊的成员函数来控制这些操作.即拷贝构造函数(copy constructor) ...

随机推荐

  1. Overload和Override的区别 C++ Java

    Overload:顾名思义,就是Over(重新)——load(加载),所以中文名称是重载. 它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名.返回值.类型不能相同: 或者说可以改变参数 ...

  2. java实现《剑指offer》(一)1~10

    每段代码都是在牛客网在线编程通过后,然后拷过来的,准确性可以保证. 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入 ...

  3. android 插件合集

    1.增加编译速度:fastdex-plugin 2.gradle 版本网站http://services.gradle.org/distributions/

  4. python -- 算法

    给定四个数字,找出不重复的排列组合可能 # 黑魔法方法,还纳闷 lambda 不能 yield 其实把 [] 改为小括号即是生成器啦 func = lambda num_tuple:((i,j,k,n ...

  5. JAVA单链表的实现-不带头结点且没有尾指针

    本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...

  6. writen.c

    #include <unistd.h> #include <errno.h> ssize_t writen(int fd, const void *vptr, size_t n ...

  7. GBK-----UTF-8编码格式问题浅析

    首先,想必大家在不同环境下切换写代码的时候,都会遇见乱码的时候(读取二进制的时候采用的编码和最初将字符转换成二进制时的编码不一致.),大多数人都知道,只需要把项目工程的编码格式调整一下为最初的编码就可 ...

  8. hadoop - 基础操作

    查看文件: [root@hadoop hadoop]# hadoop fs -lsr /drwxr-xr-x - root supergroup 0 2016-12-27 10:49 /homedrw ...

  9. luogu P4744 [Wind Festival]Iron Man

    再次感谢题解区大佬的指点 规定\(pre[i]\)表示前缀\(i\)的前缀和,\(sum[i][j]\)表示区间\([i,j]\)之和 令\(f[i][j]\)表示前i个数选出j段的最大值,\(g[i ...

  10. 使用Jupyter lab前应该读的几篇文章

    知乎上的一篇文章: 如何优雅的使用Jupyter? Jupyter Lab原来还有如下使用方式: 执行Shell命令 Hintland(提示命令).snippets(插入代码段).一键美化代码等功能( ...