|
|

楼主 |
发表于 2006-12-8 16:57:00
|
显示全部楼层
Re:求助:如何编写模版类支持NULL==obj的operator
这个是我的代码,我希望实现
xObjectRef<Type> obj;
if( NULL == obj )
{
}
==========================代码=========================
template <class TClass>
class xObjectRef
{
typedef struct tagObjectRef
{
int nRefCount;
TClass* pObject;
BYTE ObjMem[sizeof(TClass)+(4-sizeof(TClass)&3)];
}ObjectRef;
static xObjectPoolEx_T<ObjectRef> m_xObjectRefPool;
public:
xObjectRef() : m_pObjectRef(NULL)
{
}
xObjectRef( xObjectRef<TClass> & objref ) : m_pObjectRef(objref.m_pObjectRef)
{
if( this->m_pObjectRef != NULL )
this->m_pObjectRef->nRefCount++;
}
explicit xObjectRef( TClass * pObject ) : m_pObjectRef(NULL)
{
if( pObject != NULL )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = pObject;
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
}
}
virtual ~xObjectRef()
{
Free();
}
xObjectRef<TClass> & Create()
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1>
xObjectRef<TClass> & Create( Tp1 p1 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1, class Tp2>
xObjectRef<TClass> & Create( Tp1 p1, Tp2 p2 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1, p2 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1, class Tp2, class Tp3>
xObjectRef<TClass> & Create( Tp1 p1, Tp2 p2, Tp3 p3 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1, p2, p3 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1, class Tp2, class Tp3, class Tp4>
xObjectRef<TClass> & Create( Tp1 p1, Tp2 p2, Tp3 p3, Tp4 p4 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1, p2, p3, p4 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1, class Tp2, class Tp3, class Tp4, class Tp5>
xObjectRef<TClass> & Create( Tp1 p1, Tp2 p2, Tp3 p3, Tp4 p4, Tp5 p5 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1, p2, p3, p4, p5 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1, class Tp2, class Tp3, class Tp4, class Tp5, class Tp6>
xObjectRef<TClass> & Create( Tp1 p1, Tp2 p2, Tp3 p3, Tp4 p4, Tp5 p5, Tp6 p6 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1, p2, p3, p4, p5, p6 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
template <class Tp1, class Tp2, class Tp3, class Tp4, class Tp5, class Tp6, class Tp7>
xObjectRef<TClass> & Create( Tp1 p1, Tp2 p2, Tp3 p3, Tp4 p4, Tp5 p5, Tp6 p6, Tp7 p7 )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = (TClass*)m_pObjectRef->ObjMem;
CALL_CON( pRef->pObject, p1, p2, p3, p4, p5, p6, p7 ); // 创建Object
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
return (*this);
}
VOID Free()
{
if( m_pObjectRef != NULL )
{
m_pObjectRef->nRefCount--;
if( m_pObjectRef->nRefCount <= 0 )
{
TClass * pObj = (TClass*)m_pObjectRef->ObjMem;
CALL_DEC( pObj ); // 销毁Object
m_xObjectRefPool.deleteObject( m_pObjectRef );
}
m_pObjectRef = NULL;
}
}
xObjectRef<TClass> & operator =( xObjectRef<TClass> & objref )
{
Free();
m_pObjectRef = objref.m_pObjectRef;
if( m_pObjectRef )
{
m_pObjectRef->nRefCount++;
}
return (*this);
}
xObjectRef<TClass> & operator =( TClass * pObject )
{
if( pObject != NULL )
{
ObjectRef * pRef = this->m_xObjectRefPool.newObject();
if( pRef )
{
pRef->pObject = pObject;
Free();
this->m_pObjectRef = pRef;
pRef->nRefCount++;
}
}
}
bool operator ==( const xObjectRef<TClass> & objref ) const
{
return (m_pObjectRef == objref.m_pObjectRef );
}
bool operator ==( TClass * pObject ) const
{
if( m_pObjectRef == NULL )
{
return (pObject==NULL);
}
return ((TClass*)m_pObjectRef->ObjMem == pObject );
}
bool operator !=( const xObjectRef<TClass> & objref ) const
{
return (m_pObjectRef != objref.m_pObjectRef );
}
bool operator !=( TClass * pObject ) const
{
if( m_pObjectRef == NULL )
{
return (pObject!=NULL);
}
return ((TClass*)m_pObjectRef->ObjMem == pObject );
}
(operator TClass*)()const{ return (TClass*)m_pObjectRef->ObjMem;}
(operator TClass&)()const{ return *(TClass*)m_pObjectRef->ObjMem;}
TClass * operator->()const{ return (TClass*)m_pObjectRef->ObjMem;}
TClass & operator*()const{ return *(TClass*)m_pObjectRef->ObjMem;}
protected:
ObjectRef * m_pObjectRef;
};
template <class TClass>
xObjectPoolEx_T<typename xObjectRef<TClass>::ObjectRef> xObjectRef<TClass>::m_xObjectRefPool;
// for NULL == *this
template <class TClass>
inline bool operator ==( const int pObject, const xObjectRef<TClass> & ref )
{
return (ref == (TClass*)pObject);
} |
|