friend (友元的一个妙用)

在软件设计的时候,我们如果希望一个对象只能由另一个对象生成,比如水果农厂里面可以结出各种各样的水果,而水果不能平白无故的产生。

所以水果对象的构造函数肯定是private,而水果农厂却可以NewFruit(), 其中将水果农厂(CFruitFarm)作为友元,插入到各种水果当中就可以实现这

个效果。下面举例说明:

#include <iostream>
#include <string>
using namespace std;


//class CFruitFactory;
class ICanBeEat
{
public:
	virtual void Eat() = 0;
};
class CApple : public ICanBeEat
{
	friend class CFruitFactory;
private:
	void *pSource;
	CApple(void *pSource) { this->pSource = pSource; }
	void Eat(){ cout<< "Im eat apple" <<endl; } 
};


class COrange : public ICanBeEat
{
	friend class CFruitFactory;
private:
	void *pSource;
	COrange(void *pSource) { this->pSource = pSource; }
	void Eat(){ cout<< "Im eat orange" <<endl; } 
};


class CFruitFactory
{
private:
	void *pSource;	//将工厂里的资源传递给生成的对象
public:
	enum enumFruit
	{
		enumAPPLE = 0,
		enumORANGE
	};
	ICanBeEat * NewFruit(enumFruit enumVar)
	{
		if(enumVar == enumAPPLE)
			return new CApple(pSource);
		else if(enumVar == enumORANGE)
			return new COrange(pSource);
	}
};


int main()
{
	//COrange obj1(NULL); //error, because constructor is private
	//CApple obj2(NULL); //error, because constructor is private
	CFruitFactory objFruit;
	ICanBeEat *pObj = objFruit.NewFruit(CFruitFactory:: enumAPPLE);
	pObj->Eat();


	pObj = objFruit.NewFruit(CFruitFactory:: enumORANGE);
	pObj->Eat();
}

以上的手法,就可以约束水果只能由水果农厂生成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值