/********************************************************************
文件名 : 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");
}