在学习智能指针的时候,老师曾经说过,智能指针shared_ptr内部的实现原理就是代理模式,代理了普通指针本来的工作,重载了->和*操作符。
代理模式的其中一种运用就是,智能指引,当调用其真实的对象时,代理处理另外一批事。
真实的计算对象的引用次数,也就是指针的强引用和弱引用,当该对象没有引用次数的时候,可以自动释放它。
智能指针的引用计数
现在要追求一个女孩子,可是我不敢去直接送她礼物,这时,我需要找一个僚机,帮我撩妹。首先要生成一个被追求女孩子的类。
class SchoolGirl//被追求的女孩子
{
public:
SchoolGirl(string name)
{
m_name = name;//女孩子的名字
}
private:
string m_name;
};
其次,兄弟我要告诉用什么方法去追僚机,送点花花草草还行,送个跑车钻戒岂不是亏大了。所以我封装了追求女孩子的各种方法,无法实例化,代理人只能继承我的追求方法来随机行事。
class IGiveGift//封装了具体的追求方法
{
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveChocolate() = 0;
};
我追求者从网上找了不少撩妹的技能点,从中抽取了一部分来当作泡妞秘籍!
class Pursuit : public IGiveGift
{
public:
Pursuit() {}
SchoolGirl* mm = NULL;//初始化要追的女孩子对象
Pursuit(SchoolGirl* mm)//构造函数里面需要知道追的女孩
{
this->mm = mm;
}
virtual void GiveDolls()
{
cout << "送你洋娃娃" << endl;
}
virtual void GiveFlowers()
{
cout << "送你鲜花" << endl;
}
virtual void GiveChocolate()
{
cout << "送你巧克力" << endl;
}
};
僚机快跟上,就是那个妹子,帮我要到联系方式今晚请你吃饭。
class Proxy : public IGiveGift
{
public:
Pursuit gg;//需要知道是哪个兄弟要撩妹
Proxy(SchoolGirl mm)//需要知道要撩哪个妹子
{
gg = new SchoolGirl(mm);//兄弟,我来帮你撩妹
}
void GiveDolls()
{
gg.GiveDolls();//在代理人的方法中选一个来用
}
void GiveFlowers()
{
gg.GiveFlowers();
}
void GiveChocolate()
{
gg.GiveChocolate();
}
};
下面就是客户端代码了。
int main()
{
SchoolGirl jiaojiao("娇娇");//要追的女孩的名字
Proxy* daili = new Proxy(jiaojiao);//兄弟,我要知道妹子的名字
daili->GiveChocolate();//这里调用泡妞秘籍其中的一招
getchar();
}
最后实现送你巧克力的功能。