284-C++对象池

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(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值