⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_safeptr.h

📁 网络游戏魔域源代码 测试可以完整变异
💻 H
字号:
// 安全指针模板
// 仙剑修,2001.12.15


#ifndef	T_SAFEPTR
#define T_SAFEPTR

#pragma warning(disable:4786)
#include "common.h"

/*
#define	LogSave	printf		//sys	
#define LF	"\n"					// 
#define SHOWINC	printf("[+%d+]", m_nCount)		// 
#define SHOWDEC printf("[-%d-]", m_nCount)		// 
//*/
//*else
//#define	LogSave	printf		//sys	
#define LF	// "\n"					
#define SHOWINC	// printf("[+%d+]", m_nCount)		
#define SHOWDEC // printf("[-%d-]", m_nCount)		
//*/


//////////////////////////////////////////////////////////////////////////////////////////////////
template < class T, unsigned long MYID >
class	TSafePtr
{
public:
	TSafePtr() { m_ptr = NULL; m_nCount++; SHOWINC; }
	TSafePtr(T * ptr) { 
		if(ptr != m_pDefault)	m_ptr = ptr; else m_ptr = NULL;		//? 无意义。不会为m_pDefault
		m_nCount++; SHOWINC; 
	}		//? 未检测参数是否有效
	TSafePtr(T & ref) {
		if(ref.m_ptr != m_pDefault)	m_ptr = ref.m_ptr; else m_ptr = NULL;		//? 无意义。不会为m_pDefault
		m_nCount++; SHOWINC; 
	}
	~TSafePtr() { 
		m_nCount--; SHOWDEC; 
		if(!m_nCount && m_pDefault){ 
#ifdef	SAFEPTR_COMSTYLE
			m_pDefault->ReleaseByOwner();
#else
			delete m_pDefault; 
#endif
			m_pDefault = NULL; } 
	}
public:
//	T & operator =(T * ptr) { m_ptr = ptr; }		//? 未检测参数是否有效
	operator T * () { Valid(); return m_ptr; }		//? 为保证NULL指针语义正确,不转换为缺省参数
	operator == (T * ptr) { Valid(); return (m_ptr == ptr); }
	T * operator ->() { if(Valid(false)) return m_ptr; else return Default(); }
private:
	bool	Valid(bool bEnableNull = true);		// 通常允许空指针
	T *		Default();
protected:
	T *	m_ptr;
	static T *	m_pDefault;
	static int	m_nCount;		// TSafePtr对象的个数
};

/////////////////////////////////////////////////////////////////////////////////
template < class T, unsigned long MYID >
T * TSafePtr<T, MYID>::m_pDefault = NULL;

template < class T, unsigned long MYID >
int	TSafePtr<T, MYID>::m_nCount = 0;

/////////////////////////////////////////////////////////////////////////////////
// 检查指针有有效性,并将无效指针(尾随引用)改为NULL。
template < class T, unsigned long MYID >
bool	TSafePtr<T, MYID>::Valid(bool bEnableNull /*= true*/)
{
	if(bEnableNull && !m_ptr)
		return true;

	if(m_ptr)
	{
		try{
			unsigned long nID = m_ptr->GetObjType();			//??? 直接使用函数,而非从模板参数中传递。
			if(nID == MYID)
				return true;		// 正常返回
			else
			{
				LOGERROR("ERROR: TSafePointer<%d>::operator->() type dismatch to %d." LF, MYID, nID);
				ASSERT(!"TSafePtr");
			}
		}catch(...){
			m_ptr = NULL;
			LOGERROR("CATCH ERROR: TSafePointer<%d>::operator->() can't access object. follow access." LF, MYID);
			ASSERT(!"TSafePtr");
		}
	}
	else
	{
		LOGERROR("ERROR: TSafePointer<%d>::operator->() null pointer access.uninitial pointer." LF, MYID);
		ASSERT(!"TSafePtr");
	}

	return false;
}

template < class T, unsigned long MYID >
T *		TSafePtr<T, MYID>::Default()
{
	// 出错处理
	try
	{
#ifdef	SAFEPTR_COMSTYLE
			m_pDefault->ReleaseByOwner();
#else
		delete m_pDefault;			//??? 直接使用函数,而非从模板参数中传递。
#endif
	}catch(...){
		LOGERROR("CATCH ERROR: TSafePointer<%d>::operator->() can't access default object." LF, MYID);
		ASSERT(!"TSafePtr");
//?????			m_nCount = 0;
	}

#ifdef	SAFEPTR_COMSTYLE
			m_pDefault = T::CreateNew();
#else
	m_pDefault = new T;
#endif

	return m_pDefault;
}


#endif	// T_SAFEPTR

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -