日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

由Qt中qApp想到的(这是单例模式么???)

發布時間:2023/12/9 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由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();??
  • ????//?note:?it?is?the?subclasses'?job?to?call??
  • ????//?QCoreApplicationPrivate::eventDispatcher->startingUp();??
  • }??
  • 所以就是:定義程序唯一的實例時,初始化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
  • /*?
  • ??測試函數,測試通過myApp輸出唯一的實例名?
  • */??
  • #include?"myapplication.h"??
  • #include?<iostream>??
  • ??
  • void?print1()??
  • {??
  • ????if(myApp==0)??
  • ????????std::cout<<"myApp沒有實例化"<<std::endl;??
  • ????else??
  • ????????myApp->printAppName();??
  • }??
  • print2.cpp

    [cpp]?view plaincopy
  • /*?
  • ??測試函數,測試通過myApp輸出唯一的實例名?
  • */??
  • #include?"myapplication.h"??
  • #include?<iostream>??
  • ??
  • void?print2()??
  • {??
  • ????if(myApp==0)??
  • ????????std::cout<<"myApp沒有實例化"<<std::endl;??
  • ????else??
  • ????????myApp->printAppName();??
  • }??

  • 總結

    以上是生活随笔為你收集整理的由Qt中qApp想到的(这是单例模式么???)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。