| Members | Description | |||
| CSmartPtr | Constructor | |||
| Detach | Removes the contained object from the control of the smart pointer | |||
| operator & | Allows the smart pointer to be referenced | |||
| operator < | determines if this pointer is greater than another | |||
| operator > | determines if this pointer is less than another | |||
| operator * | Allows the smart pointer to be dereferenced | |||
| operator T* | Cast operator, automatically casts the smart pointer to the type of object T. | |||
| operator ! | true if the pointer to an object is NULL | |||
| operator != | false if the pointer pT is the same as the pointer held within this smart pointer | |||
| operator -> | Allows access to the underlying object | |||
| operator = | Copy operator | |||
| operator == | Compares the value of the pointers. | |||
| Ptr | A pointer to the object wrapped by this Smart pointer | |||
| Release | Releases the underlying object. | |||
| _PtrClass | typedef T _PtrClass; |
Class Definition
template <class T>
class CSmartPtr
{
public:
typedef T _PtrClass;
CSmartPtr()
{
p = NULL;
}
CSmartPtr(T* lp)
{
if ((p = lp) != NULL)
p->AddRef();
}
CSmartPtr(const CSmartPtr<T>& lp)
{
if ((p = lp.p) != NULL)
p->AddRef();
}
~CSmartPtr()
{
if (p)
p->Release();
}
void Release()
{
if (p)
{
p->Release();
p = NULL;
}
}
operator T*()
{
return p;
}
operator const T*() const
{
return p;
}
T* operator->()
{
ASSERT(p!=NULL);
return p;
}
const T* operator->() const
{
return p;
}
operator T*() const
{
return p;
}
T& operator*() const
{
ASSERT(p!=NULL);
return *(p);
}
//The assert on operator& usually indicates a bug. If this is really
//what is needed, however, take the address of the p member explicitly.
T** operator&()
{
ASSERT(p==NULL);
return &(p);
}
T* operator=(T* lp)
{
if (lp != NULL)
lp->AddRef();
if (p)
p->Release();
p = lp;
return p;
}
T* operator=(const CSmartPtr<T>& lp)
{
T* pTmp = p;
p = lp.p;
if (p != NULL)
p->AddRef();
if (pTmp != NULL)
pTmp->Release();
return p;
}
bool operator!() const
{
return (p == NULL);
}
bool operator<(T* pT) const
{
return p < pT;
}
bool operator==(T* pT) const
{
return p == pT;
}
bool operator!=(T* pT) const
{
return p != pT;
}
T* Ptr()
{
return dynamic_cast<T*>(p);
}
void Attach(T* p2)
{
if (p)
p->Release();
p = p2;
}
T* Detach()
{
T* pt = p;
p = NULL;
return pt;
}
protected:
T* p;
};