`
3895177
  • 浏览: 23645 次
社区版块
存档分类
最新评论

关于CREATE_FUNC宏的用法(未完成,将补充不用CREATE_FUNC如何定义)

 
阅读更多

源地址:

http://blog.csdn.net/jinciyulang/article/details/8631889

阅读cocos2d-x demo的代码,我们会看到有些头文件中使用CREATE_FUNC这个宏,那么它是做什么的呢?在cocos2d-x 又是起什么作用呢?下面我们就一起来看看CREATE_FUNC宏的源代码:

/**
 * define a create function for a specific type, such as CCLayer
 * @__TYPE__ class type to add create(), such as CCLayer
 */
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}

 注释中写的很明确,为一个类似CCLayer类的特定的类增加一个create函数(就是这个宏给自动给我们写了一个create的一个函数,我们自己不用定义create()也可以用create()函数).我们也可以看到在宏的下面定义了一个create()函数返回的类型就是宏带入的参数__TYPE__指针类型.那create函数里做了什么呢?它执行了类的构造函数,执行了init()初始化函数,最后又设置创建出的对象为自动释放内存.这样其他人在使用这个类的时候,只要是用create()函数创建出来的对象就不用费心去管理释放内存了.这个宏是不是很好用?

 

分享到:
评论

相关推荐

    Linux操作系统内核中工作队列的操作

    为了简化`struct work_struct`的创建和初始化过程,Linux内核提供了几个宏定义: - **`__WORK_INITIALIZER`**:用于初始化一个`struct work_struct`实例。这个宏会初始化`entry`链表节点、`func`回调函数和`data`...

    Python教程-再说循环.pdf

    列表构建器是一种简洁、高效的创建列表的方法,它可以在一行代码内完成对序列的迭代和操作。例如,创建1到100的平方数列表: ```python lix = [x * x for x in range(1, 101)] ``` 列表构建器还可以包含条件语句,...

    C语言多线程

    ### C语言多线程知识点详解 ...在这个例子中,我们定义了一个线程函数`thread_func`,并在`main`函数中创建了一个线程来执行这个函数。通过`pthread_join()`函数等待新创建的线程完成,确保资源被正确释放。

    8-存储过程和存储函数实验.docx

    1. 使用`CREATE FUNCTION`语句定义存储函数`func_1`,接受用户名称作为参数。 2. 构建SQL查询语句,查询该用户当前借阅中的图书名称。 3. 调用存储函数`func_1`并传入实际用户名称,查看返回结果。 #### 4. 创建...

    MY_SQL_常用语句

    MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),因其高效性、稳定性和易用性而备受开发者青睐。本文档将基于给定的部分内容来深入探讨MySQL中的一些常用操作语句。 #### 二、基本操作 ##### 1. 显示...

    浅谈Linux条件变量的使用

    本文将深入探讨Linux条件变量的使用方法及其应用场景。 #### 二、条件变量简介 条件变量是一种用于实现线程间同步的机制,它主要用于解决线程之间的协作问题,特别是当一个线程需要等待某个条件成立时才能继续执行...

    ajs-homeworks-prototypes-func

    - **`Object.create()`**:这个方法可以用来创建一个新对象,并将新对象的原型设置为另一个对象,即实现原型继承。 2. **函数(Functions)**: - **函数作为一等公民**:在JavaScript中,函数是一种数据类型,...

    Python自定义线程池实现方法分析

    本篇文章将深入探讨如何在Python中自定义线程池,包括其概念、原理、实现方法以及注意事项。 线程池的基本思想是预先创建一定数量的线程,这些线程在完成任务后不会立即销毁,而是进入空闲状态,等待新的任务到来。...

    grub4dos-V0.4.6a-2017-02-04更新

    执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....

    你必须知道的495个C语言问题

    将结构体成员初始化为常量或使用宏定义。 **2.9 怎样从/向数据文件读/写结构?** 使用`fwrite`和`fread`函数,确保结构体的布局符合文件格式。 **2.10 我的编译器在结构中留下了空洞,这导致空间浪费而且无法与...

    LuaBind 源码 (Lua增强库)

    你正在使用一个UNIX系统(或者 cygwin),他们将使得构建LuaBind静态库变得很简单.如果 你正在使用 Visual Studio ,很简单的包含 src 目录下的文件到你的工程即可. 构建LuaBind的时候,你可以设定一些选项来使得库更加...

    Linux多线程使用互斥量同步线程

    ### Linux多线程使用互斥量同步线程 #### 一、什么是互斥量 互斥量(Mutex,Mutual Exclusion Object)是一种用于多线程编程中的同步机制,其目的是确保同一时间只有一个线程可以访问共享资源或临界区。这种机制...

    json 开发包使用

    3. `createJson()`:此方法创建了一个JSONArray,但代码未完成,通常你会在这里添加更多的元素或对象,然后将其转换为JSON字符串。 在实际项目中,你可能还需要处理更复杂的JSON结构,例如包含嵌套对象或数组的对象...

    RxJava基本流程

    `Subscriber` 的三个方法 `onCompleted()`、`onError()` 和 `onNext()` 分别对应于 Observable 发送完成信号、发送错误或发送数据时的回调。 ### FitMap 的使用 `flatMap()` 是 RxJava 中的一个转换操作符,它接受...

    腾讯09年技术类面试题收集和面试成功的心得体会

    - 第一种方法是每次需要写数据时将socket加入epoll,接收到可写事件后写入数据,完成后移出epoll。这种方式虽然简单,但增加了epoll_ctl的操作成本。 - 第二种方法,即直接写(directly-write),尝试直接调用send...

    oracl转mysql注意事项

    - **系统自动生成ID** -> `FUNC_CREATE_GUID()` - **获取有变化的行** -> `SELECT ROW_COUNT(); IF ROW_COUNT = 0 THEN ...` #### 四、总结 从Oracle到MySQL的迁移是一项复杂的工作,涉及数据库结构、数据类型、...

    你必须知道的495个C语言问题 程序员必看

    然而,如果确实需要使用全局变量,建议将它们定义在一个单独的头文件中,并使用适当的`extern`声明来暴露给其他源文件。这样可以避免命名冲突,并且易于维护。 **1.4 `extern`在函数声明中是什么意思?** `extern`...

Global site tag (gtag.js) - Google Analytics