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

📄 multiptr.h.htm

📁 mfc资料集合5
💻 HTM
字号:
/////////////////////////////////////////////////////////////////////
// Class Creator Version 2.0.000 Copyrigth (C) Poul A. Costinsky 1994
///////////////////////////////////////////////////////////////////
// Header File multiptr.h
// class CWizMultiPtr
//
// 29/11/1995 14:49                             Author: Poul
///////////////////////////////////////////////////////////////////

#ifndef __CWizMultiPtr_H
#define __CWizMultiPtr_H

/////////////////////////////////////////////////////////////////////////////
// Warning!!! class TYPE must have default constructor !!!
// class CWizMultiPtr
template <class TYPE, class CNT_TYPE>
class CWizBaseMultiPtr
{
public:
// Constructors:
	CWizBaseMultiPtr ()  : m_pObject (new CNT_TYPE) {}
	CWizBaseMultiPtr (const CWizBaseMultiPtr& T) : m_pObject (NULL)
		{ Init (T); }
// Destructor:
	~CWizBaseMultiPtr () { CleanUp(); }
public:
	CWizBaseMultiPtr& operator=(const CWizBaseMultiPtr& T)
		{ CleanUp(); Init (T); return *this; }
// Operations:
	TYPE*		GetPtr() 	  { return &(m_pObject->Data); }
	TYPE* 		operator->() 	  { return &(m_pObject->Data); }
	const TYPE*	GetPtr() const 	  { return &(m_pObject->Data); }
	const TYPE* 	operator->()const { return &(m_pObject->Data); }

	TYPE& 		operator*() 	  { return m_pObject->Data; }
	const TYPE& 	operator*()const  { return m_pObject->Data; }
protected:
// Implementation:
	void Init(const CWizBaseMultiPtr& T);
	void CleanUp();
protected:
// Members:
	CNT_TYPE*	m_pObject;
protected:
	// Constructor for derived classes
	CWizBaseMultiPtr (CNT_TYPE*	m_pObject) 
		: m_pObject (m_pObject) 
			{}
};

/////////////////////////////////////////////////////////////////////////////
template <class TYPE>
class SIMPLE_CNT_TYPE
{
public:
	TYPE	Data;
	int	Counter;
	// Constructor:

	SIMPLE_CNT_TYPE() : Counter(1) {}
	~SIMPLE_CNT_TYPE() { Counter = -1; }
};
/////////////////////////////////////////////////////////////////////////////
template <class TYPE>
class CWizMultiPtr : public CWizBaseMultiPtr<TYPE, SIMPLE_CNT_TYPE<TYPE> >
{
public: // Copy constructor is compiler-generated
	CWizMultiPtr() {}
	CWizMultiPtr& operator=(const CWizMultiPtr& T)
		{ CWizBaseMultiPtr<TYPE, SIMPLE_CNT_TYPE<TYPE> >::operator=(T); return *this; }
};

/////////////////////////////////////////////////////////////////////////////
template <class TYPE,class CNT_TYPE>
CWizBaseMultiPtr<TYPE,CNT_TYPE>& CWizBaseMultiPtr<TYPE,CNT_TYPE>::operator=(const CWizBaseMultiPtr& T)
{ 
	CleanUp(); 
	Init (T); 
	return *this; 
}

template <class TYPE,class CNT_TYPE>
inline void CWizBaseMultiPtr<TYPE,CNT_TYPE>::Init(const CWizBaseMultiPtr& T)
{
	if (T.m_pObject == NULL)
		m_pObject = new CNT_TYPE;
	else
		{
		m_pObject = T.m_pObject;
		T.m_pObject->Counter++;
		}
}

template <class TYPE,class CNT_TYPE>
inline void CWizBaseMultiPtr<TYPE,CNT_TYPE>::CleanUp()
{
	if (m_pObject != NULL)
		{
		if (m_pObject->Counter <= 1)
			{
			delete m_pObject;
			m_pObject = NULL;
			}
		else
			m_pObject->Counter--;
		}
}
/////////////////////////////////////////////////////////////////////////////

#endif // __CWizMultiPtr_H


⌨️ 快捷键说明

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