cocos2d-x节点(CCObject.h)API

本文详细介绍了Cocos2d-x中的对象引用计数器的使用方法和比较,包括对象复制、释放、保留所有权等操作,并提供了API文档和示例代码。

本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-x节点(CCObject.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

对象引用计数器的使用和比较

///\cocos2d-x-3.0alpha0\cocos2dx\cocoa
//对象引用计数器的使用和比较


#ifndef __CCOBJECT_H__
#define __CCOBJECT_H__

#include "cocoa/CCDataVisitor.h"
#include "ccMacros.h"

#ifdef EMSCRIPTEN
#include <GLES2/gl2.h>
#endif // EMSCRIPTEN

NS_CC_BEGIN

/**
 * @addtogroup base_nodes
 * @{
 */

class Object;
class Node;

/** 定义如何克隆一个对象的接口 */
class CC_DLL Clonable
{
public:
	/** 返回对象的副本 */
    virtual Clonable* clone() const = 0;
    /**
     * @js NA
     * @lua NA
     */
	virtual ~Clonable() {};

    /** 返回对象的副本 .
     @过时不再需要建议使用新的 API。使用 clone() 代替
     */
    CC_DEPRECATED_ATTRIBUTE Object* copy() const
    {
        // 使用 "clone" 代替
        CC_ASSERT(false);
        return nullptr;
    }
};

class CC_DLL Object
{
public:
    /// 对象的 id, ScriptSupport 需要一个 public _ID
    unsigned int        _ID;
    /// Lua 饮用 id
    int                 _luaID;
protected:
    /// 引用计数
    unsigned int        _reference;
    /// 统计 autorelease 数量
    unsigned int        _autoReleaseCount;
public:
    /**
     * Constructor
     *
     *创建后对象的引用计数为1
     * @js NA
     */
    Object();
    
    /**
     * @js NA
     * @lua NA
     */
    virtual ~Object();
    
    /**
     * 立即释放所有权.
     *
     * 这个对象的引用计数减1
     *
     * 如果引用计数器减少到 0 后这个对象就不存在了
     *
     * @see retain, autorelease
     * @js NA
     */
    inline void release()
    {
        CCASSERT(_reference > 0, "reference count should greater than 0");
        --_reference;

        if (_reference == 0)
            delete this;
    }

    /**
     * 保持所有权
     *
     *这增加了该对象的引用计数。
     *
     * @see release, autorelease
     * @js NA
     */
    inline void retain()
    {
        CCASSERT(_reference > 0, "reference count should greater than 0");
        ++_reference;
    }

    /**
     * 不久的某个时候自动释放所有权.
     *
     * 在当前自动释放池里,减少这个对象的引用计数
     *
     *  如果引用计数器减少到 0 后这个对象就不存在了
     *
     * @returns 这个对象自己.
     *
     * @see AutoreleasePool, retain, release
     * @js NA
     * @lua NA
     */
    Object* autorelease();

    /**
     * Returns 一个 boolean 值,表示这个对象是否只被饮用了一次
     *也就是说,这个对象的引用计数器是否是 1.
     *
     * @returns 这个对象的引用计数器是否是 1.
     * @js NA
     */
    bool isSingleReference() const;

    /**
     * Returns 这个对象的引用计数.
     *
     * @returns 这个对象的引用计数.
     * @js NA
     */
    unsigned int retainCount() const;

    /**
     * Returns 一个 boolean 值,表示这个对象是否和给定对象相等.
     *
     * @param object    需要比较的对象.
     *
     * @returns True 如果这个对象和 @p 对象 equal, otherwise false.
     * @js NA
     * @lua NA
     */
    virtual bool isEqual(const Object* object);
    /**
     * @js NA
     * @lua NA
     */
    virtual void acceptVisitor(DataVisitor &visitor);
    /**
     * @js NA
     * @lua NA
     */
    virtual void update(float dt) {CC_UNUSED_PARAM(dt);};
    
    friend class AutoreleasePool;
};


typedef void (Object::*SEL_SCHEDULE)(float);
typedef void (Object::*SEL_CallFunc)();
typedef void (Object::*SEL_CallFuncN)(Node*);
typedef void (Object::*SEL_CallFuncND)(Node*, void*);
typedef void (Object::*SEL_CallFuncO)(Object*);
typedef void (Object::*SEL_MenuHandler)(Object*);
typedef int (Object::*SEL_Compare)(Object*);

#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
#define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)
#define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)
#define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)
#define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)
#define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)
#define event_selector(_SELECTOR) static_cast<cocos2d::SEL_EventHandler>(&_SELECTOR)
#define compare_selector(_SELECTOR) static_cast<cocos2d::SEL_Compare>(&_SELECTOR)

// 新的 callbacks 基于 C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)

// end of base_nodes group
/// @}

NS_CC_END

#endif // __CCOBJECT_H__


【源码免费下载链接】:https://renmaiwang.cn/s/p79ex 作为一种广泛应用的光子学设备,调Q光纤激光器通过调节激光系统的Q因子,我们可以有效地产生高强度、短时宽的光脉冲。在现代科学技术中,MATLAB作为一款功能强大的数值计算和仿真软件,在科学与工程领域中,它通常被用来进行数值模拟和数据分析。对于像调Q光纤激光器这样的复杂系统,我们可以通过下载名为“基于matlab的调Q光纤激光器模拟Q.zip”的压缩包来获取相关的建模代码或教学资源。这种技术的核心机制是通过动态调整谐振腔中的能量损耗比(即增益与损耗之和的比例),从而实现瞬间释放大量能量,形成高功率脉冲。在MATLAB环境下进行这样的仿真研究,通常会围绕以下几个重点内容展开:首先,我们需要深入理解激光器的工作原理,这包括对其物理组成及功能的基本认识。其次,在涉及到光纤作为主要载波介质时,也需要掌握其特定的光学特性。此外,在数值模拟过程中,我们还必须建立合理的数学模型来描述激光腔内的光场演化过程等关键环节。通过这些分析可以发现,调Q光纤激光器的工作原理与优化设计在很大程度上依赖于对激光器内部物理机制的深入理解以及精准的数值模拟技术的应用。在此基础上,我们需要掌握如何通过调节系统的各个参数(如Q开关的动作速度、泵浦功率等),来实现最佳的工作性能。同时,在实际操作中,我们还需要注意一些关键的技术要点,例如如何处理光纤中的非线性效应对激光器输出的影响。最后,在完成数值模拟之后,我们可以通过MATLAB提供的强大可视化工具,将仿真结果以图形或曲线的形式呈现出来,从而更直观地分析系统的动态行为特性。综上所述,“基于matlab的调Q光纤激光器模拟Q.zip”这个压缩包可能包含了完整的代码实现和相关实验数据,这对于我们深入学习这一技术领域具有重要的参考价值。如果有机会可以运行这些文件并进行进一步研究,相信会对掌握
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值