以下是main函数最开始的两段,也是cocos2d一开始执行的地方:
AppDelegate app;return Application::getInstance()->run();
接下来用代码对以上函数进行简单复原:
#include#include
using namespacestd;classAbstractBase
{public:virtual void denglu() = 0;virtual void houtai() = 0;virtual void tuichu() = 0;
};class Application :publicAbstractBase
{public:
Application()
{
sm= this;
}boolrun()
{
denglu();return true;
}static Application*GetInStance()
{
assert(sm);returnsm;
}static Application*sm;
};
Application* Application::sm =NULL;class AppDelegate :privateApplication
{public:void denglu() override{
cout<< "登录" <
}void houtai() override{
cout<< "后台运行" <
}voidtuichu()
{
cout<< "退出" <
}
};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<
Application::GetInstance这一步的执行才会正确,这是关键所在.