IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板

    冬瓜发表于 2014-08-01 03:30:00
    love 0
    本文地址: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 m_Sprite;
    //在init中
    m_Sprite = CCSprite::create("");
    //或
    m_Sprite.create()


    冬瓜 2014-08-01 11:30 发表评论


沪ICP备19023445号-2号
友情链接