下面是实现代码
//在很多时候,类的成员是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的对象智能指针模板
原文地址:http://blog.csdn.net/zdhsoft/article/details/38333877