Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181807
  • 博文数量: 18
  • 博客积分: 334
  • 博客等级: 入伍新兵
  • 技术积分: 233
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-20 14:45
文章分类

全部博文(18)

文章存档

2015年(5)

2013年(7)

2012年(6)

我的朋友

分类: C/C++

2015-12-22 17:26:13


分析工程入口如下:
     首先要找到main.cpp文件,文件地址在win32/
          main.cpp的主要代码如下:

点击(此处)折叠或打开

  1. AppDelegate app;
  2. return CCApplication::sharedApplication()->run();
    看到代码 我们会看CCApplication里写了什么,进入CCApplication.h文件,我们会发现CCAplication继承了CCApplicationProtocol

点击(此处)折叠或打开

  1. class CC_DLL CCApplication : public CCApplicationProtocol
定义了run()成员函数、静态的成员函数sharedApplication()和静态的成员变量sm_pSharedApplication

点击(此处)折叠或打开

  1. virtual int run()

点击(此处)折叠或打开

  1. static CCApplication* sharedApplication();

点击(此处)折叠或打开

  1. static CCApplication * sm_pSharedApplication;
在其.cpp文件里进行了实现,主要代码如下:
1、run()函数实现

点击(此处)折叠或打开

  1. int CCApplication::run()
  2. {
  3.     
  4.     if (!applicationDidFinishLaunching())
  5.     {
  6.         return 0;
  7.     }
  8. }
2、sharedApplication()函数实现如下:

点击(此处)折叠或打开

  1. CCApplication* CCApplication::sharedApplication()
  2. {
  3.     return sm_pSharedApplication;
  4. }
3、静态的成员变量sm_pSharedApplication实现如下:
(1)、对sm_pSharedApplication进行了初始化

点击(此处)折叠或打开

  1. CCApplication * CCApplication::sm_pSharedApplication = 0;
(2)、在CCApplication的构造函数里对sm_pSharedApplication进行赋值

点击(此处)折叠或打开

  1. CCApplication::CCApplication()
  2. {
  3.     sm_pSharedApplication = this;
  4. }
现在我们知道CCAplication继承了CCApplicationProtocol,那么我们看一下CCApplicationProtocol写了什么,进入之后我们发现CCApplicationProtocol是一个抽象类

点击(此处)折叠或打开

  1. class CC_DLL CCApplicationProtocol
  2. {
  3. public:

  4.     virtual ~CCApplicationProtocol() {}

  5.     virtual bool applicationDidFinishLaunching() = 0;
  6.     virtual void applicationDidEnterBackground() = 0;
  7.     virtual void applicationWillEnterForeground() = 0;
  8.     virtual void setAnimationInterval(double interval) = 0;
  9.     virtual ccLanguageType getCurrentLanguage() = 0;
  10.     virtual TargetPlatform getTargetPlatform() = 0;
  11. };
回顾上面的代码,我们发现在CCAplication的run()函数里面调用了applicationDidFinishLaunching()函数,那么applicationDidFinishLaunching()函数是在哪里实现的呢?,通过对代码的追踪 我们会找到一个APPDelegate类,这里实现了applicationDidFinishLaunching()函数

点击(此处)折叠或打开

  1. bool AppDelegate::applicationDidFinishLaunching() {
  2.     // initialize director
  3.     CCDirector* pDirector = CCDirector::sharedDirector();
  4.     CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();

  5.     pDirector->setOpenGLView(pEGLView);
  6.     
  7.     // turn on display FPS
  8.     pDirector->setDisplayStats(true);

  9.     // set FPS. the default value is 1.0/60 if you don't call this
  10.     pDirector->setAnimationInterval(1.0 / 60);

  11.     // create a scene. it's an autorelease object
  12.     CCScene *pScene = HelloWorld::scene();

  13.     // run
  14.     pDirector->runWithScene(pScene);

  15.     return true;
  16. }
在这段代码里我们会发现这段代码就是工程开发的开始,并且APPDelegate继承了CCAplication。

点击(此处)折叠或打开

  1. class AppDelegate : private cocos2d::CCApplication
其实以上代码运用了多态,我们分析一下,程序是如何实现的多态的。
首先要写一下多态成立的三个条件
     1、要有继承
     2、有virtual重写
     3、父类指针指向了子类对象
1、要有继承,代码中有继承
2、有virtual重写,代码中有重写
     CCApplication::sharedApplication()->run();
     CCApplication::sharedApplication()是父类指针,父类指针调用了run,run里面调用的是applicationDidFinishLaunching()接口,applicationDidFinishLaunching()接口在AppDelegate里实现,所有就会跑到AppDelegate这边,
AppDelegate继承了 CCApplication,子类复写了父类里的虚接口
3、父类指针指向了子类对象,这个条件是如何实现的呢?

我们分析一下代码
在main.cpp里AppDelegate app生成了子类对象
AppDelegate app如何指向了父类指针呢?CCApplication::sharedApplication()指针怎么就是指向的子类的对象呢?
我们进入AppDelegate里 首先我们看到了构造函数和析构函数,但是里面全没有进行实现,在父类的构造函数和析构函数里有一句话 sm_pSharedApplication=this;

我们思考一下this指向的是谁?
this就是AppDelegate,子类对象实例化的时候调用了父类的构造函数,实现了父类指针指向了子类对象。
所有第三个条件也是成立的

以下是我画的分析流程图:




阅读(1281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~