由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
  1. static QCoreApplication *instance() { return self; }  
这个函数返回self,看大片self也定义为静态指针:

[cpp] view plaincopy
  1. static QCoreApplication *self;  

在QCoreapplication.cpp中有如下代码:

[cpp] view plaincopy
  1. void QCoreApplication::init()  
  2. {  
  3.     ......  
  4.     QCoreApplication::self = this;  
  5.     ......  
  6. }  

QCoreapplication构造函数中又调用init()

[cpp] view plaincopy
  1. QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)  
  2.     : QObject(p, 0)  
  3. {  
  4.     init();  
  5.     // note: it is the subclasses' job to call  
  6.     // QCoreApplicationPrivate::eventDispatcher->startingUp();  
  7. }  

所以就是:定义程序唯一的实例时,初始化self指向自身。qApp是一个宏,替换后为调用相应的instance()。


自己模仿的:

myApplication.h

[cpp] view plaincopy
  1. #ifndef MYAPPLICATION_H  
  2. #define MYAPPLICATION_H  
  3.   
  4. #include <string>  
  5. using std::string;  
  6.   
  7. #define myApp myApplication::instance()  
  8.   
  9. class myApplication  
  10. {  
  11. public:  
  12.     myApplication(string _appName);  
  13.   
  14.     static myApplication* instance(){return self;}  
  15.     void printAppName();  
  16. private:  
  17.     //指向自己的实例句柄  
  18.     static myApplication *self;  
  19.     string appName;  
  20. };  
  21.   
  22. #endif // MYAPPLICATION_H  
myApplication.cpp

[cpp] view plaincopy
  1. #include "myapplication.h"  
  2. #include <iostream>  
  3. using std::cout;  
  4. using std::endl;  
  5.   
  6. myApplication::myApplication(string _appName):appName(_appName)  
  7. {  
  8.     if(self!=0)  
  9.         return;  
  10.     else  
  11.         self=this;  
  12. }  
  13.   
  14. void myApplication::printAppName()  
  15. {  
  16.         cout<<appName<<endl;  
  17. }  
  18.   
  19. myApplication* myApplication::self=0;  

main.cpp

[cpp] view plaincopy
  1. #include "myapplication.h"  
  2.   
  3. extern void print1();  
  4. extern void print2();  
  5.   
  6. int main()  
  7. {  
  8.     print1();  
  9.     print2();  
  10.   
  11.     myApplication app("实例测试");  
  12.     print1();  
  13.     print2();  
  14.     app.printAppName();  
  15.     myApp->printAppName();  
  16.   
  17.     return 0;  
  18. }  
print1.cpp

[cpp] view plaincopy
  1. /* 
  2.   测试函数,测试通过myApp输出唯一的实例名 
  3. */  
  4. #include "myapplication.h"  
  5. #include <iostream>  
  6.   
  7. void print1()  
  8. {  
  9.     if(myApp==0)  
  10.         std::cout<<"myApp没有实例化"<<std::endl;  
  11.     else  
  12.         myApp->printAppName();  
  13. }  
print2.cpp

[cpp] view plaincopy
  1. /* 
  2.   测试函数,测试通过myApp输出唯一的实例名 
  3. */  
  4. #include "myapplication.h"  
  5. #include <iostream>  
  6.   
  7. void print2()  
  8. {  
  9.     if(myApp==0)  
  10.         std::cout<<"myApp没有实例化"<<std::endl;  
  11.     else  
  12.         myApp->printAppName();  
  13. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根据网页地址获取页面内容

public JSONObject urlConn(String urlStr, String portStr){ String port getPort(portStr); urlStr (urlStr ! null)?(host port "/?" urlStr):(host port); int responseCode; try { url new URL(urlStr); conn (HttpURLConnection) url.openConnection…

bootstrap基础学习十篇

bootstrap字体图标&#xff08;Glyphicons&#xff09; a.什么是字体图标 字体图标是在 Web 项目中使用的图标字体。虽然&#xff0c;Glyphicons Halflings 需要商业许可&#xff0c;但是您可以通过基于项目的 Bootstrap 来免费使用这些图标。 b.bootstrap自带字体图标文件结构…

Python 用hashlib求中文字符串的MD5值

From&#xff1a; http://blog.csdn.net/haungrui/article/details/6959340 使用过hashlib库的朋友想必都遇到过以下的错误吧&#xff1a;“Unicode-objects must be encoded before hashing”&#xff0c;意思是在进行md5哈希运算前&#xff0c;需要对数据进行编码。而且在不…

[Redux/Mobx] Mobx的设计思想是什么

[Redux/Mobx] Mobx的设计思想是什么 依赖收集。在Mobx中&#xff0c;定义了observable的属性&#xff0c;mobx会自动跟踪这个属性值的变化&#xff1b;在用了mobx与react的桥接库mobx-react之后&#xff0c;这种跟踪关系会体现了视图上&#xff0c;JSX依赖的observable属性值变…

csu 1008 - Horcrux

不得不表示&#xff0c;能用栈来做的题目前对我来说都很费解&#xff0c;这题又是抄的&#xff0c;来自校友JMDWQ&#xff0c;只不过把C改成了C。开始时我用的是暴搜&#xff0c;数组的每一位就是一个“魂器”&#xff0c;而他的栈结构里每一位是连续相同的“魂器”的长度&…

0301——SearchController

创建显示的页面 SearchViewController * searchVC [[SearchViewController alloc]init]; 告诉搜索控制器将结果显示在创建的页面上 self.searchController [[UISearchController alloc]initWithSearchResultsController:searchVC]; 由谁来监听搜索内容发生的事件 self.search…

[Redux/Mobx] 推荐在reducer中触发Action吗?为什么?

[Redux/Mobx] 推荐在reducer中触发Action吗&#xff1f;为什么&#xff1f; 不推荐。首先reducer应该是一个纯函数&#xff0c;reducer中的代码应该把代码逻辑限定在当前的reducer内&#xff0c;如果触发了action&#xff0c;会触发其它的reducer、甚至再次触发自身&#xff0…

windows等宽字体

From: http://plplum.blog.163.com/blog/static/310324002009814105634/ windows下的等宽字体&#xff1a; BatangChe Courier Courier New DotumChe Fixedsys GulimChe GungsuhChe Lucida Console Lucida Sans Typewriter MingLiU MS Gothic MS Mincho Terminal 仿宋_GB2312 楷…

JS中的Replace方法

最近查一个bug&#xff0c;原因是JS中的Replace方法造成的&#xff0c;当将一个字符串中有处需要替换时&#xff0c;一般会用到JS中的Replace方法&#xff0c;Replace方法的第一个参数如果是传的字符串&#xff0c;只会替换第一处。代码如下&#xff1a; var str "0CEA65…

sed替换变量

今天在写脚本时用到了sed&#xff0c;我用sed替换xml文件中的变量。一般在sed 中替换都用单引号&#xff0c;如下边 sed -i ‘s/10/1000/g’ test.xml但是如果需要把1000改成变量&#xff0c;如sed -i ’s/10/$num/g‘ test.xml这样就不成功。 此时需要把单引号改成双引号,如下…

[Redux/Mobx] 你有了解Rxjs是什么吗?它是做什么的?

[Redux/Mobx] 你有了解Rxjs是什么吗&#xff1f;它是做什么的&#xff1f; RxJS 是一个库&#xff0c;它通过使用 observable 序列来编写异步和基于事件的程序。它提供了一个核心类型 Observable&#xff0c;附属类型 (Observer、 Schedulers、 Subjects) 和受 [Array#extras]…

使用Windows命令行启动服务

From: http://www.cnblogs.com/wlei/archive/2011/12/24/2300389.html 在自己电脑上搭建了一个svn服务器&#xff0c;以服务的形式注册到了windows中&#xff0c;每次启动都要去服务选项中开启&#xff0c;感觉很麻烦&#xff0c;GOOGLE了一下&#xff0c;发现早就有了好方法&a…

mysql cluster 7.1搭建

简单步骤&#xff0c;分享下&#xff1a; hostname IP 应用 db1 192.168.50.10 MGM db2 192.168.50.20 NDBD db3 192.168.50.30 NDBD2 db4 192.168.50.40 MYSQLD db5 192.168.50.50 MYSQLD ***************************** 1.安装配置管理节点(DB1)MGM ************…

redis实现cache系统实践(六)

1. 介绍 rails中就自带有cache功能&#xff0c;不过它默认是用文件来存储数据的。我们要改为使用redis来存储。而且我们也需要把sessions也存放到redis中。关于rails实现cache功能的源码可见于这几处: https://github.com/rails/rails/blob/master/activesupport/lib/active_su…

[Redux/Mobx] 在redux中,什么是action?

[Redux/Mobx] 在redux中&#xff0c;什么是action&#xff1f; action是Redux中定义一个响应的动作&#xff0c;action总是有一个type属性&#xff0c;作为这个动作的唯一标识; Reducer函数则会根据这个action.type来如何生成并返回一个新的state 个人简介 我是歌谣&#x…

VMware 9 安装 Mac OS X 10.8 Mountain Lion 图文全程

From: http://unmi.cc/vmware9-install-mac-os-x-mountain-lion/#comment-8684 本教程是在 VMware 9 下安装当前最新版的 Mac OS X Mountain Lion 苹果系统。曾在 VirtualBox/VMware 下安装过 Mac OS Lion 系统&#xff0c;但安装后是无法升级到 Mountain Lion 的&#xff0c;所…

显示和快速隐藏Mac桌面所有图标

隐藏&#xff1a;defaults write com.apple.finder CreateDesktop -bool false;killall Finder;say icons hidden恢复显示&#xff1a;defaults write com.apple.finder CreateDesktop -bool true;killall Finder;say icons show上面的操作甚至可以制作成为一个Applescript&…

正则表达式基础恶补

1.基本用途 正则表达式两种基本用途&#xff1a;搜索和替换。 2.单个字符匹配(.).字符可以匹配任何单个字符&#xff0c;类似于sql中的_。注意特殊字符匹配时要使用反斜杠\\。 3.匹配一组字符([])[]之间的所有字符都是该集合的组成部分&#xff0c;字符集合的匹配结果是能够与集…

[Redux/Mobx] Mobx和Redux有什么区别?

[Redux/Mobx] Mobx和Redux有什么区别&#xff1f; Redux每一次的dispatch都会从根reducer到子reducer嵌套递归的执行&#xff0c;所以效率相对较低&#xff1b;而Mobx的内部使用的是依赖收集&#xff0c;所以不会有这个问题&#xff0c;执行的代码较少&#xff0c;性能相对更高…

ANSIC标准定义的6种预定义宏

From: http://biancheng.dnbcw.info/c/277439.html ANSIC标准定义了以下6种可供C语言使用的预定义宏&#xff1a; __LINE__ 在源代码中插入当前源代码行号 __FILE__ 在源代码中插入当前源代码文件名 …