###寫在開頭的話 本人工做是有5,6年了,可是C++也荒廢了5.6年,此次從新拿起來忘記了好多東西.有什麼地方說的不對的地方請各位高手指點一下.本人很是感謝. ###CCApplication的來源html
CCApplication繼承自CCApplicationProtocol,這個咱們先無論它,咱們本身寫個例子ios
1.新建CCApplication類app
/* * CCApplication.h * * Created on: 2013-9-21 * Author: sjbwybls */框架
#ifndef CCAPPLICATION_H_函數
#define CCAPPLICATION_H_this
#include <iostream>spa
#include <string>.net
namespace TestCocos2dx {指針
using namespace std;code
class CCApplication { public: CCApplication(); virtual ~CCApplication(); int run(); static CCApplication * sharedApplication() { cout<<"return static app"<<endl; return sm_pSharedApplication; }
protected: static CCApplication * sm_pSharedApplication;
};
} /* namespace TestCocos2dx */
#endif /* CCAPPLICATION_H_ */
/* * CCApplication.cpp * * Created on: 2013-9-21 * Author: sjbwybls */
#include "CCApplication.h"
namespace TestCocos2dx {
CCApplication *CCApplication::sm_pSharedApplication = 0;
CCApplication::CCApplication() { cout << "app ctor" << endl; sm_pSharedApplication = this; }
CCApplication::~CCApplication() { cout << "app destroy" << endl; sm_pSharedApplication = NULL; }
int CCApplication::run(){ cout << "run() function, sm_pSharedApplication = " << sm_pSharedApplication << endl; return 0;
}
} /* namespace TestCocos2dx */
/* * CCDerivedCCApplication.h * * Created on: 2013-9-21 *
Author: sjbwybls */#ifndef CCDERIVEDCCAPPLICATION_H_
#define CCDERIVEDCCAPPLICATION_H_
#include <iostream>
#include <string>
#include "CCApplication.h"
namespace TestCocos2dx {
class CCDerivedCCApplication: public TestCocos2dx::CCApplication { public: CCDerivedCCApplication(); virtual ~CCDerivedCCApplication(); };
} /* namespace TestCocos2dx / #endif / CCDERIVEDCCAPPLICATION_H_ */
/* * CCDerivedCCApplication.cpp * * Created on: 2013-9-21 *
Author: sjbwybls */#include "CCDerivedCCApplication.h"
namespace TestCocos2dx {
using namespace std;
CCDerivedCCApplication::CCDerivedCCApplication() { cout<<"DerivedCCApplication ctor"<<endl;
}
CCDerivedCCApplication::~CCDerivedCCApplication() { cout<<"DerivedCCApplication destory"<<endl; }
} /* namespace TestCocos2dx */
3.最後創建main.cpp
/* * main.cpp * * Created on: 2013-9-21 * Author: sjbwybls */
#include "CCApplication.h"
#include "CCDerivedCCApplication.h"
using namespace TestCocos2dx;
int main() { CCApplication::sharedApplication()->run(); CCDerivedCCApplication app; CCApplication::sharedApplication()->run(); }
4.輸出結果 return static app run() function, sm_pSharedApplication = 0 app ctor DerivedCCApplication ctor return static app run() function, sm_pSharedApplication = 0x7fff56b50c20 DerivedCCApplication destory app destroy
5.分析 main.cpp中的實例化了一個CCDerivedCCApplication的實例app。 調用流程: 返回靜態父類實體並執行run函數
父類構造函數 子類構造函數 執行run函數 析構子類函數 析構父類函數
6.結論 先從C++的語法說明: C++中靜態函數不會觸發構造函數 聲明一個對象不須要new.便可觸發構造函數([具體可參考][1]) 父類跟子類的 構造函數調用關係爲 先初始化父類構造函數再初始化子類構造函數 析構函數爲 恰好相反 先調用子類析構函數再調用父類析構函數 CCApplication的用法 CCApplication app; //先調用Application必須先初始化Application,也能夠從子類調用 CCApplication::sharedApplication()->run(); //最後執行run方法才能拿到初始化以後的Application,負責就只會等到空指針錯誤,這個也就是Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)錯誤出現的緣由吧,但願高手拍磚
本文啓發自:[初學試試看cocos2dx的TestCPP框架(1)][2] [1]:http://www.metsky.com/archives/580.html "聲明類實例用new與不用new的區別" [2]:http://blog.csdn.net/hayyoung/article/details/8536719 "初學試試看cocos2dx的TestCPP框架(1)"