[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()

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

时间: 2024-10-11 05:26:24

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

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

现在,C++有许多实现智能指针,一个更无所谓.哈. 这种智能指针是专为cocos2dx 2.2.x自定义.主要的易用性,同时必须遵循现有的cocos2dx内存管理.特殊实现这样的智能指针.无需在使用时考虑retain要么release操作.须要new或delete操作! 以下是实现代码 //在非常多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理.特实现了这种一个智能指针,方便使用. #ifndef _X_COCOS_PTR_H_ #define

[cocos2dx笔记007]一个自定义场景切换的实例

cocos2dx框架已经提供了很多场景切换的类,但是一些自定义的场景切换,只有自己实现了.下面是实现的类.这里设计的分辨率是750*500.请根据实际的要求调整. 头文件 #ifndef _TRANSITION_GAME_H_ #define _TRANSITION_GAME_H_ #include <cocos2d.h> namespace cocos2d { class CCTransitionGame : public CCTransitionScene { public: CCTran

[cocos2dx笔记005]一个字符串管理配置类

在用vs开发cocos2dx过程中.要显示的中文,要求是UTF-8格式的才干正常显示出来.但VS通常是ANSI格式保存,这样,在代码中写入的中文字符串,执行后.显示的就是乱码. 为了正确显示中文.或支持多语言,我这里定义一个简单的字符串管理类,来满足上述要求. 这个类使用了我的开源码中的XAnsiString和XMap.TextIni这几个类.能够在我的开放代码找到下载. 以下是代码://字符串资源管理器 #ifndef _X_STRING_MANAGER_H_ #define _X_STRIN

[cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类

用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 #ifndef _X_NUMBER_H_ #define _X_NUMBER_H_ #include <cocos2d.h> #include <xtype.h> namespace cocos2d { //基于图片显示的数字 /* 这个类不是用一个一个数字拼起来,而是渲染成一个独立的纹

初学c课程笔记整理7--&gt;&gt;二维数组、字符串、指针

是什么?有什么用?用在什么地方?(理解) 养成良好的编程习惯; 培养编程思想: 写代码之前应该先分析需求,分析完需求再开始写代码:(写注释)   1.二维数组 1.1 二维数组的基本概念: 所谓多维数组就是一个一维数组的每个元素又被声明为一 维数组,从而构成二维数组. 可以说二维数组是特殊的一维数组. 示例 int a[2][3] 可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素 1.2 二维数组的定义: 数组中的每一个元素又是一个数组, 那么这个数组

C++ Primer 学习笔记_56_STL剖析(十一)(原boost库):详解智能指针(unique_ptr(原scoped_ptr) 、shared_ptr 、weak_ptr源码分析)

注意:现在boot库已经归入STL库,用法基本上还和boost类似 在C++11中,引入了智能指针.主要有:unique_ptr, shared_ptr, weak_ptr. 这3种指针组件就是采用了boost里的智能指针方案.很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关间: std boost 功能说明 unique_ptr scoped_ptr 独占指针对象,并保证指针所指对象生命周期与其一致 shared_ptr shared_ptr 可共享指针对象,可以赋值给shar

c++学习笔记——智能指针

智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一个伴随类,它是一种弱引用,指向shared_ptr所管理的对象.这三种类型都定义在memory头文件中. 下面是一个在网上看到的智能指针的实现原理代码: class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr(int *p) : i

C++之对象成员指针

对象成员指针:对象的指针作为另外一个类的成员 对象成员指针既可以用初始化列表进行初始化,也可以使用普通构造函数进行初始化 对象成员指针常见的初始化方式和销毁方式 原文地址:https://www.cnblogs.com/xjyxp/p/11238760.html

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

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