生活随笔
收集整理的這篇文章主要介紹了
由Qt中qApp想到的(这是单例模式么???)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
From:?http://blog.csdn.net/qq575787460/article/details/7880972
學Qt時,發現只要包含頭文件QApplication或者QCoreapplication,就用使用qApp,指向一個當前實例。
查看源碼發現qApp是個宏:
QApplication中:#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))
QCoreapplication中:#define qApp QCoreApplication::instance()
所以可以肯定的是QCoreApplication有個靜態函數instance()返回指向自己的指針。
[cpp]?view plaincopy
static?QCoreApplication?*instance()?{?return?self;?}??
這個函數返回self,看大片self也定義為靜態指針:
[cpp]?view plaincopy
static?QCoreApplication?*self;??
在QCoreapplication.cpp中有如下代碼:
[cpp]?view plaincopy
void?QCoreApplication::init()?? {?? ????......?? ????QCoreApplication::self?=?this;?? ????......?? }??
QCoreapplication構造函數中又調用init()
[cpp]?view plaincopy
QCoreApplication::QCoreApplication(QCoreApplicationPrivate?&p)?? ????:?QObject(p,?0)?? {?? ????init();?? ?????? ?????? }??
所以就是:定義程序唯一的實例時,初始化self指向自身。qApp是一個宏,替換后為調用相應的instance()。
自己模仿的:
myApplication.h
[cpp]?view plaincopy
#ifndef?MYAPPLICATION_H?? #define?MYAPPLICATION_H?? ?? #include?<string>?? using?std::string;?? ?? #define?myApp?myApplication::instance()?? ?? class?myApplication?? {?? public:?? ????myApplication(string?_appName);?? ?? ????static?myApplication*?instance(){return?self;}?? ????void?printAppName();?? private:?? ?????? ????static?myApplication?*self;?? ????string?appName;?? };?? ?? #endif?//?MYAPPLICATION_H??
myApplication.cpp
[cpp]?view plaincopy
#include?"myapplication.h"?? #include?<iostream>?? using?std::cout;?? using?std::endl;?? ?? myApplication::myApplication(string?_appName):appName(_appName)?? {?? ????if(self!=0)?? ????????return;?? ????else?? ????????self=this;?? }?? ?? void?myApplication::printAppName()?? {?? ????????cout<<appName<<endl;?? }?? ?? myApplication*?myApplication::self=0;??
main.cpp
[cpp]?view plaincopy
#include?"myapplication.h"?? ?? extern?void?print1();?? extern?void?print2();?? ?? int?main()?? {?? ????print1();?? ????print2();?? ?? ????myApplication?app("實例測試");?? ????print1();?? ????print2();?? ????app.printAppName();?? ????myApp->printAppName();?? ?? ????return?0;?? }??
print1.cpp
[cpp]?view plaincopy
? ? ?? #include?"myapplication.h"?? #include?<iostream>?? ?? void?print1()?? {?? ????if(myApp==0)?? ????????std::cout<<"myApp沒有實例化"<<std::endl;?? ????else?? ????????myApp->printAppName();?? }??
print2.cpp
[cpp]?view plaincopy
? ? ?? #include?"myapplication.h"?? #include?<iostream>?? ?? void?print2()?? {?? ????if(myApp==0)?? ????????std::cout<<"myApp沒有實例化"<<std::endl;?? ????else?? ????????myApp->printAppName();?? }??
總結
以上是生活随笔為你收集整理的由Qt中qApp想到的(这是单例模式么???)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。