友元族的实现

/******************************************************************** 
 文件名 :     TimeEvtCenter.h 
 创建人  :    Clark/陈泽丹 
 创建时间 :   2012-5-7
 描述:		  友元族的实现
			  后面进一步, 会把友元族触碰函数用双分派的方法实现反射
 *********************************************************************/ 

#include <iostream>

using namespace std;

class NPC
{
public:
	NPC():HP(100),Armor(2){}
	void Show(){ cout<<HP<<endl; cout<<Armor<<endl; }
private:
	int HP;
	int Armor;
	template<int v>
	friend class HitRetsult;
};

class Magic
{
public:
	Magic():Hurt(20){}
private:
	int Hurt;
	template<int v>
	friend class HitRetsult;
};


class Item
{
public:
	Item():Armor(3){}
private:
	int Armor;
	template<int v>
	friend class HitRetsult;
};

template<int v>
class HitRetsult;


const int NPC_MAGIC = 0;
template<>
class HitRetsult<NPC_MAGIC>
{
public:
	void operator() (NPC* _pNpc, Magic* _pMagic)
	{
		_pNpc->HP = _pNpc->HP - _pMagic->Hurt;
	}
};

const int NPC_ITEM = 1;
template<>
class HitRetsult<NPC_ITEM>
{
public:
	void operator() (NPC* _pNpc, Item* _pItem)
	{
		_pNpc->Armor = _pNpc->Armor + _pItem->Armor;
	}
};

void main()
{
	NPC npc;
	Magic magic;
	Item item;

	npc.Show();

	HitRetsult<NPC_MAGIC> hitMagic;
	hitMagic(&npc, &magic);
	npc.Show();

	HitRetsult<NPC_ITEM> hitItem;
	hitItem(&npc, &item);
	npc.Show();

	system("pause");  
}


 

你可能感兴趣的:(友元族的实现)