您的位置:首页 > 移动开发 > Cocos引擎

[cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板

2014-08-01 11:34 363 查看
现在C++智能指针有无数个实现了,多一个也无所谓。哈。

这个智能指针是专门为cocos2dx 2.2.x定制的。主要是为了方便使用,同时又要遵循现有的cocos2dx的内存管理。特实现这样一个智能指针。在使用的时候不需要考虑retain或release操作,也不需要new或delete操作!

下面是实现代码

//在很多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理,特实现了这样的一个智能指针,方便使用。
#ifndef _X_COCOS_PTR_H_
#define _X_COCOS_PTR_H_
namespace zdh
{
	template<class T>
	class XCocosPtr
	{
	public:
		XCocosPtr()
			:m_Object(nullptr)
		{}

		XCocosPtr(T * paramObject)
			:m_Object(paramObject)
		{
			if (m_Object != nullptr)
			{
				m_Object->retain();
			}
		}

		XCocosPtr(const XCocosPtr & paramPtr)
			:m_Object(paramPtr.m_Object)
		{
			if (m_Object != nullptr)
			{
				m_Object->retain();
			}
		}

		~XCocosPtr()
		{
			ptr_release();
		}
		//重载赋值运算符
		XCocosPtr & operator = (T * paramObject)
		{
			set(paramObject);
			return *this;
		}

		XCocosPtr & operator = (XCocosPtr & paramObject)
		{
			set(paramObject.m_Object);
			return *this;
		}
		//重载比较运算符
		bool operator == (T * paramObject) const
		{
			return m_Object == paramObject;
		}

		bool operator != (T * paramObject) const
		{
			return m_Object != paramObject;
		}
		//重载*运算符
		T & operator*()
		{
			return *m_Object;
		}

		const T & operator*() const
		{
			return *m_Object;
		}
		//重载->运算符,使其可以像指针那样使用
		T * operator ->()
		{
			return m_Object;
		}

		const T * operator ->() const
		{
			return m_Object;
		}
		//判断对象是否为空
		bool is_null() const
		{
			return m_Object == nullptr;
		}
		//判断对象是否为不空
		bool is_not_null() const
		{
			return m_Object != nullptr;
		}
		//创建对象 这里会使用调用对象的create来创建对象
		T * create()
		{
			T * pNewObject = T::create();
			set(pNewObject);
			return pNewObject;
		}
		//设置对象
		void set(T * paramObject)
		{
			if (m_Object != paramObject)
			{
				T * p = m_Object;
				m_Object = paramObject;
				if (m_Object != nullptr)
				{
					m_Object->retain();
				}
				if (isNotNULL(p))
				{
					p->release();
				}
			}
		}
		//取对象
		T * get()
		{
			return m_Object;
		}
		//这里没有使用release这个名称,是为了防止和object的release混淆
		void ptr_release()
		{
			if (m_Object != nullptr)
			{
				m_Object->release();
				m_Object = nullptr;
			}
		}
	private:
		T * m_Object;
	};
}
#endif


例子:

//类的数据成员定义:
XCocosPtr<CCSprite> m_Sprite;
//在init中
m_Sprite = CCSprite::create("");
//或
m_Sprite.create()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: