委托Delegation 笔记----C++学习之路

本文探讨了C++中的委托概念,将其与复合进行对比,并指出委托是通过引用(by reference)实现的复合。通过String和StringRep的示例解释了pimpl(pointer to implementation)模式,也就是Handle/Body设计模式,强调了委托如何提供编译防火墙并实现对象的不变性。此外,文章还讨论了基于委托的reference counting和copy on write技术在内存管理中的应用。

  1.委托的概念:

委托和复合非常相似,也是一个类含有has-a一个东西,但是这种拥有很虚,我们不知道何时才会拥有。只在我想

要用到这个东西的时候才去调用,这是与复合的不同。委托的另外一个术语就很明了:Compositon by reference

含有指针的复合,为什么不是by point,因为约定俗成,就是by reference。

举个例子:

class StringRep;
class String
{
public:
    String();
    String(const chat* s);
    String(const String& s);
    String &operator=(const String& s);
    ~String();
    ....
private:
    StringRep* rep;
};

从寿命上来看,复合关系下的寿命是同步的,同时创建,同时死亡。而委托不同步。

从委托上来看,委托方也就是String只是一个对外的接口,而实现的功能全都委托给StringRep来做。

这种写法成为:pimpl (point to implementation),我有一根指针指向一个替我实现所有功能的类。

也成为 Handle/Body 左边为Handle,右边为Body。

这种写法实现,委托方对外不变,受委托方变。也就是受委托方变动不会影响客户端的东西,也称为编译防火墙。


  2.关于这种写法的一些原理以及处理

StringRep代码:

#include "String.hpp"
namespace
{
class StringRep
{
friend class String;
    StringRep(const char* s);
    ~StringRep();
    int count;
    char* rep;
};
}

String::String(){ .... }
...

可以看到StringRep中的数据由count(图中的n)与一个字符指针rep。n外的大圆圈就是StringRep。

如图由三个字符串都指向hello,这个n将会是3.从共享上来看,内存就节省了。这就是Handle/Body的实现,可以做出reference counting共享的原理。

那么当我a要去改变hello,这个时候就会copy一份给a去更改,bc依然共享。这种叫做copy on write。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值