码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-01 13:44:22      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:cocos2dx   智能指针   c++   

现在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()


[cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板,布布扣,bubuko.com

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

标签:cocos2dx   智能指针   c++   

原文地址:http://blog.csdn.net/zdhsoft/article/details/38333877

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!