本文地址:
http://www.shnenglu.com/zdhsoft/archive/2014/08/01/207880.html現在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()