zoukankan      html  css  js  c++  java
  • 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这一步的执行才会正确,这是关键所在.
  • 相关阅读:
    魅族17系列真机谍照泄露 前摄挖孔将添新功能
    联想在S规则债券市场完成了里程碑式的新债券发行
    王小二切饼、马拦过河卒
    Codeforces Round #561 (Div. 2) A Tale of Two Lands 【二分】
    19年省赛后总结
    Winner Winner【模拟、位运算】
    GCDLCM 【米勒_拉宾素数检验 (判断大素数)】
    Floating-Point Hazard【求导公式】
    Communication【floyd判环+并查集】
    Largest Allowed Area【模拟+二分】
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13765216.html
Copyright © 2011-2022 走看看