1.对象池是通过模板来实现的
2.可以拿链表构建一个对象池,也可以拿顺序表来构建一个对象池,但是拿链表构建一个对象池进行扩充的时候比较方便
3.对象和对象的关系
类模板不仅要处理数据还要处理类型
从上到下耦合性(关联性)越来越强
依赖:通过一个对象的方法使用另一个对象
关联:可以用指针和引用指向或者引用到我们使用的对象上,和特定的对象产生关联
聚合:整体和部分之间是可以分离的,它们各自有各自的声明周期,整体死亡,部分可以存活
组合:整体和部分之间是不可以分离的,整体死亡,那么部分也死亡
①依赖关系
程序类中间的依赖关系是两个独立的对象之间非常轻微的一种关系
就是说是两个独立的对象,只是在一个对象当中会用到另外一个对象
②关联关系
关联分为强关联和弱关联
关联关系是依赖关系的一个特例
问下面程序能否编译通过?
答案: 不能编译通过,因为在实例化student的时候必须要对引用进行初始化
下面程序能否合法构建对象?
答案:student将book传递给构造函数的形参时,传递的是一个副本给形参对象,_book引用的是一个形参对象,当构造函数结束时,形参对象被析构,所以不能以这种形式构建对象
上面程序应该修改为
③聚合关系
拿汽车和汽车的零件来举例子,汽车这个对象死亡了,但是并不意味着汽车的零件的这些对象也要死亡,汽车这个整体和汽车零件这个部分是可以分开的
在聚合关系中,不需要整体的构造函数设为私有,因为整体和部分之间是可以单独存活的,所以并没有强制要求
④组合关系
组合关系是由…组成,比如拿人体和人体的器官来举例子,心脏是一个对象,肝是一个对象,它们不能独立存活,人这个对象死亡,那么心脏、肝等对象也会死亡
在组合关系中,要把整体的构造函数设为私有,这样部分就不能脱离整体而单独存在了
4.用队列来管理的内存池
template<class _Ty>
class ObjectPool
{
enum {
nPoolSize = 4 };
protected:
struct _Node
{
_Node* next;
};
_Node* front;
_Node* rear;
void ReFillPool()
{
size_t total = sizeof(_Node) + sizeof(_Ty);//_Node节点的大小和对象大小
for (int i = 0; i < nPoolSize; ++i)
{
_Node* s = (_Node*)malloc(total);
//new(s + 1) _Ty();
s->next = nullptr;
rear->next = s;
rear = s;
}
}
void InitPool()
{
if (rear != nullptr) return;
_Node* head = (_Node*)malloc(sizeof(_Node));
head->next = nullptr;
front = rear = head;
ReFillPool();
}
void Clear(