cocos2d-x中main函数AppDelegate app解释

来源:互联网 发布:多头螺纹加工怎么编程 编辑:程序博客网 时间:2024/06/08 06:50

博主是一位非计算机相关专业的大三党,由于自己的兴趣爱好,决定走上程序员之路.主要学的是c++.目前来说还是个小白.前几天自己看cocos2d源代码的时候,发现了一个自己怎么也看不懂的调用方式。在百度搜索了很多资料,也并没有看到有解释的很清楚的文章。所以自己决定发表一下,希望能帮助那些遇到和我同样问题的人。由于水平有限,这是我第一篇文章,有错误的地方欢迎各位大牛指出,也能帮助我自己提高。接下来是正文:


打开cocos2d-x工程,找到了它的main函数,代码很少,但这很少的代码却迷惑了我很久。

AppDelegate app;

return Application->getInstance()->run();

这两行代码几乎就是整个main函数的主体,用vs2013按f12,查看了AppDelegate和Application,发现了还有一个类:ApplicationProtocol。

这三者之间存在如下继承关系   :ApplicationProtocol<-----Application<---------AppDelegate.(“<-----”代表继承关系)

ApplicationProtocol这个类里面有很多纯虚函数,作为接口存在,其中一个这就是关键。

回到main函数中,查看run()方法源码,发现里面有调用了applicationDidFinishLaunching()这个函数,代码如下:



因为在ApplicationProtocol中是纯虚函数,那么我们就要找到真正函数的实现。首先看子类Application,并未找到applicationDidFinishLaunching(),那么我们继续找。来到AppDelegate中,很幸运的找到了:



说明run()中调用的就是AppDelegate中的applicationDidFinishLaunching();


由于在Application中并未找到applicationDidFinishLaunching(),说明Application类里面没有重写,Application依旧是一个抽象类且不能实例化。那么是如何用Application->getInstance()获取对象来调用run()的呢?

这时候我们看到Application的声明,里面有一个静态Application指针,再看Application的构造函数源代码


其实关键就在最后一句,sm_pSharedApplication=this。

以下是我个人的理解:

由于多态的特性,子类AppDelegate app,app也就是父类Application的对象,构造函数中sm_pSharedApplication=this,this指针指向的其实也就是app对象的地址,那么sm_pSharedApplication也指向app,


getInstance()返回sm_pSharedApplication,最后也就是通过app->run().



原创粉丝点击