专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  126 Posts :: 7 Stories :: 132 Comments :: 0 Trackbacks

常用链接

留言簿(13)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

本文地址:http://www.cppblog.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()
posted on 2014-08-01 11:30 冬瓜 阅读(1439) 评论(0)  编辑 收藏 引用 所属分类: 原创cocos2dx

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理