大家好,又见面了,我是全栈君。
现在,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()
版权声明:本文博主原创文章,博客,未经同意不得转载。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117035.html原文链接:https://javaforall.cn