[cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-19 10:03:23

[cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板的相关文章

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

现在C++智能指针有无数个实现了,多一个也无所谓.哈. 这个智能指针是专门为cocos2dx 2.2.x定制的.主要是为了方便使用,同时又要遵循现有的cocos2dx的内存管理.特实现这样一个智能指针.在使用的时候不需要考虑retain或release操作,也不需要new或delete操作! 下面是实现代码 //在很多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理,特实现了这样的一个智能指针,方便使用. #ifndef _X_COCOS_PTR

实现一个简洁版的智能指针

//智能指针可以自动销毁,用引用计数技术实现 #include<iostream> using namespace std; template<class T> class SmartPtr { protected:                  T* _ptr;                  size_t* _cout;                  void clear()                 {                             

【转】 C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting

这篇文章建大的介绍了如何编写一个智能指针. 介绍: 什么是智能指针?答案想必大家都知道,智能指针的目的就是更好的管理好内存和动态分配的资源,智能指针是一个智能的指针,顾名思义,他可以帮助我们管理内存.不必担心内存泄露的问题.实际上,智能指针是一个行为类似于指针的类,通过这个类我们来管理动态内存的分配和销毁.方便客户端的使用.相比于一般指针,智能指针主要体现在它使用的容易和便捷性. 转载请注明出处: http://blog.csdn.net/elfprincexu 使用一般指针的问题: 一般情况下

做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk

前言:"懒"在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! 一.懒人说书 Android.mk中LOCAL_SRC_FILES需要罗列出所有参与编译的文件,这样在.cpp文件少的时候还可以一个一个添加,当有几百个文件的时候会十分的痛苦! 我们下看看TestCpp工程中的Android.mk文件: 这只是节选的一部分,大概只有50个左右吧,除数量多

jsWindow 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。 注释:没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象。 Window 对象集合 集合 描述 frames[] 返回窗口中所有命

一.JSX简介 JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析. 如下(JS写法) var child1 = React.createElement('li', null, 'First Text Content'); var child2 = React.createElement('li', null, 'Second Text Content'); var

Cocos2d-x 3.0 打造一个全平台概念文件夹

Cocos2d-x 3.0 打造一个全平台概念文件夹http:// www.eoeandroid.com/thread-328055-1-1.html

Windows台cocos2d-x 3.2下载一个新的项目,创造的过程

首先,左右cocos2d-x于windows下一个Android建筑环境, 引用一个网友这个博客<cocos2d-x 3.0rc开发指南:Windows下Android环境搭建>. 这里简单列一下所需工具的下载地址: 1.JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.ADT(Android Developer Tools),里面包括了SDK和Eclipse. 下载地址是:http://

[cocos2dx注意事项009]试用quick-cocos2dx-2.2.4

quick-cocos2d-x 在中国站http://quick.cocoachina.com/?page_id=40,用他们自己的话说:quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系.用一句话概括:quick 是 cocos2d-x 针对 Lua 的豪华套装威力加强版. 这里是他的介绍:http://quick.cocoachina.com/? p=1 在我试用2.2.4的时候,2.2.5公布了.眼下quick也是很活跃. 首先.按他们的文章:<设置 qu

【Cocos2d-x游戏开发】细数Cocos2d-x开发中那些常用的C++11知识

自从Cocos2d-x3.0开始,Cocos2dx就正式的使用了C++11标准.C++11简洁方便的特性使程序的可拓展性和可维护性大大提高,也提高了代码的书写速度. 下面我们就来一起学习一下Cocos2d-x开发中那些不得不了解的C++11知识.  1.初始化列表 POD结构或者数组根据成员在结构内定义的顺序,可以使用初始化列表来进行初始化以简化代码. struct StructA{ int a; int b; }; StructA sa={1,2}; 在C++03中,非POD结构的类或者STL