• 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这一步的执行才会正确,这是关键所在.
  • 相关阅读:
    08-Linux命令【rm】
    07-Linux命令【mv】
    06-Linux命令【cp】
    05-Linux命令【rmdir】
    04-Linux命令【mkdir】
    03-Linux命令【ls】
    02-Linux命令【cd】
    01-Linux命令【pwd】
    智慧城市3D园区
    自我觉醒
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13765216.html
Copyright © 2020-2023  润新知