学习Kevin Lynx 的一段代码

学习Kevin Lynx 的一段代码


}

void clear_ops()
{
for( RefOpList::const_iterator it = _oplist.begin();
it != _oplist.end(); ++ it )
{
(*it)->be_null();
}
}

private:
RefOpList _oplist;
};

template <typename _Tp>
class auto_null : public ref_op
{
public:
void fetch( _Tp *t )
{
_t = t;
t->add_ref( this );
}
auto_null<_Tp> &operator = ( _Tp *t )
{
fetch( t );
return *this;
}
void be_null()
{
_t = 0;
}
operator _Tp*()
{
return _t;
}
private:
_Tp *_t;
};

//////////////////////////////////////////////////////////////////////////////
class CMonster : public ref_base
{
};

class CMonsterAI
{
public:
void SetOwner( CMonster *pOwner )
{
m_Owner = pOwner;
}

void Test()
{
if( (CMonster*)m_Owner == NULL )
{
printf( "The owner is null.\n" );
}
else
{
printf( "The owner is NOT null.\n" );
}
}
private:
auto_null<CMonster> m_Owner;
};

int main()
{
CMonster *pMonster = new CMonster();
CMonsterAI *pAI = new CMonsterAI();
pAI->SetOwner( pMonster );
pAI->Test();
delete pMonster;
pAI->Test();
delete pAI;
return 0;
}

CMonster内部会保存一个CMonster的指针,当CMonster被删除掉时,会自动更新CMonsterAI内部的CMonster“指针”为NULL。接口比较简单:1)在会被引用(即被其他对象保存其指针)的类设计中派生(或组合)ref_base类,ref_base类简单来说就是保存一个引用类对象列表,通过基类ref_op可以使得ref_base保存不同类型的引用类(例如CMonsterAI可以保存CMonster, CRegion也可以保存CMonster),ref_base在析构时自动回调引用类对象的be_null函数,be_null函数在auto_null类中自动把CMonster*设置为NULL。
通过重载operator=,使得SetOwner函数里不需要做其他操作(看起来)。

你可能感兴趣的:(学习Kevin Lynx 的一段代码)