9 复合 委托
9.1 Composition 复合
类似于c中结构里有结构——class里有class
![image-20230801093748678](https://i-blog.csdnimg.cn/blog_migrate/5fcdd836581816af4cd28ccd901fdf17.png)
deque
是一个已经存在的功能很多的类(两头进出的队列);利用deque
的功能来实现queue
的多种操作
该例只是复合的一种情况——设计模式 Adapter
9.1.1 复合下的构造和析构
![image-20230801095529359](https://i-blog.csdnimg.cn/blog_migrate/cd42e7a354bddb15bc9c4d5541256cb4.png)
-
构造是由内而外
Container 的构造函数,编译器会自动先调用 Component 的 default 构造函数,再执行自己
注意如果要调用 Component 的其他构造函数需要自己写出来
Container::Container(…): Component() { … };
-
析构是由外而内
Container 的析构函数会先执行自己,之后编译器调用 Component 的析构函数
9.2 Delegation 委托
委托就是 Composition by reference;即通过指针把任务委托给另一个类
![](https://i-blog.csdnimg.cn/blog_migrate/afc653f1f8dfa1eb8c335a770ea2a3f2.png)
复合中,内部和外部是一起出现的;而委托是不同步的
这是一个著名的设计模式——pimpl (pointer to implementation) 或者叫 “编译防火墙”
右边怎么变动都不会影响左边
reference counting 多个指针共享一个 “Hello”;但当a要改变内容时, 系统会单独复制一份出来给a来改,b和c依然在共享
![]()