本文地址:
http://www.shnenglu.com/zdhsoft/archive/2014/08/01/207880.html現(xiàn)在C++智能指針有無(wú)數(shù)個(gè)實(shí)現(xiàn)了,多一個(gè)也無(wú)所謂。哈。
這個(gè)智能指針是專(zhuān)門(mén)為cocos2dx 2.2.x定制的。主要是為了方便使用,同時(shí)又要遵循現(xiàn)有的cocos2dx的內(nèi)存管理。特實(shí)現(xiàn)這樣一個(gè)智能指針。在使用的時(shí)候不需要考慮retain或release操作,也不需要new或delete操作!
下面是實(shí)現(xiàn)代碼
//在很多時(shí)候,類(lèi)的成員是CCObject的子對(duì)象,為了保證對(duì)其正常使用,又要遵循cocos2dx的內(nèi)存管理,特實(shí)現(xiàn)了這樣的一個(gè)智能指針,方便使用。
#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();
}
//重載賦值運(yùn)算符
XCocosPtr & operator = (T * paramObject)
{
set(paramObject);
return *this;
}
XCocosPtr & operator = (XCocosPtr & paramObject)
{
set(paramObject.m_Object);
return *this;
}
//重載比較運(yùn)算符
bool operator == (T * paramObject) const
{
return m_Object == paramObject;
}
bool operator != (T * paramObject) const
{
return m_Object != paramObject;
}
//重載*運(yùn)算符
T & operator*()
{
return *m_Object;
}
const T & operator*() const
{
return *m_Object;
}
//重載->運(yùn)算符,使其可以像指針那樣使用
T * operator ->()
{
return m_Object;
}
const T * operator ->() const
{
return m_Object;
}
//判斷對(duì)象是否為空
bool is_null() const
{
return m_Object == nullptr;
}
//判斷對(duì)象是否為不空
bool is_not_null() const
{
return m_Object != nullptr;
}
//創(chuàng)建對(duì)象 這里會(huì)使用調(diào)用對(duì)象的create來(lái)創(chuàng)建對(duì)象
T * create()
{
T * pNewObject = T::create();
set(pNewObject);
return pNewObject;
}
//設(shè)置對(duì)象
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();
}
}
}
//取對(duì)象
T * get()
{
return m_Object;
}
//這里沒(méi)有使用release這個(gè)名稱(chēng),是為了防止和object的release混淆
void ptr_release()
{
if (m_Object != nullptr)
{
m_Object->release();
m_Object = nullptr;
}
}
private:
T * m_Object;
};
}
#endif
例子
//類(lèi)的數(shù)據(jù)成員定義:
XCocosPtr<CCSprite> m_Sprite;
//在init中
m_Sprite = CCSprite::create("

");
//或
m_Sprite.create()