cocos2dx 入口函数分析

以下是main函数最开始的两段,也是cocos2d一开始执行的地方:

    AppDelegate app;
    return Application::getInstance()->run();

接下来用代码对以上函数进行简单复原:

#include<iostream>
#include<assert.h>
using namespace std;
class AbstractBase
{
public:
    virtual void denglu() = 0;
    virtual void houtai() = 0;
    virtual void tuichu() = 0;
};

class Application :public AbstractBase
{
public:
    Application()
    {
        sm = this;
    }
    bool run()
    {
        denglu();
        return true;
    }
    static Application* GetInStance()
    {
        assert(sm);
        return sm;
    }

    static Application* sm;
};
Application* Application::sm = NULL;
class AppDelegate :private Application
{
public:
    void denglu() override
    {
        cout << "登录" << endl;
     }
    void houtai() override
    {
        cout << "后台运行" << endl;
     }
    void tuichu()
    {
        cout << "退出" << endl;
    }
};                

int main(int argc,char* argv[])
{

    AppDelegate app;
    Application::GetInStance()->run();  
 //return Application::GetInStance()->run();直接return在vs下会闪退,所以为了观察效果,去掉了return 
getchar(); return 0; }

输出:

 

 

可能会产生疑问,为什么不直接在Application中进行函数的复写,而是要单独拿出来,原因就是坚持对修改关闭,对扩展开放的原则,Application其实作用很大,跨平台相关的工作都是由他来进行的。

 

 

接下里对以上代码进行小结:

AppDelegate相当于子类,而Application::GetInstance会得到AppLication的指针。
又因为Application是AppDelegate的父类,所以最后一步就是父类指针调用子类覆写的虚函数,
但是这里不是直接调用的,而是通过run函数间接的调用,因为在run函数内部还会执行其他一些重要的功能.

AppDelegate app;这一步首先会创建Application的构造函数,然后才是AppDelegate的构造函数,也就是AppDelegate 对象包含了Application对象,如果在Application的构造函数中写入cout<<this<<endl;    在main函数中写cout<<&app<<endl;地址是相同的。所以

Application::GetInstance这一步的执行才会正确,这是关键所在.

 

posted @ 2020-10-03 19:27  sunshine_gzw  阅读(263)  评论(0编辑  收藏  举报