由Qt中qApp想到的(这是单例模式么???)
来源:互联网 发布:自建网站软件 编辑:程序博客网 时间:2024/06/06 08:23
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()返回指向自己的指针。
- static QCoreApplication *instance() { return self; }
- static QCoreApplication *self;
在QCoreapplication.cpp中有如下代码:
- void QCoreApplication::init()
- {
- ......
- QCoreApplication::self = this;
- ......
- }
QCoreapplication构造函数中又调用init()
- QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)
- : QObject(p, 0)
- {
- init();
- // note: it is the subclasses' job to call
- // QCoreApplicationPrivate::eventDispatcher->startingUp();
- }
所以就是:定义程序唯一的实例时,初始化self指向自身。qApp是一个宏,替换后为调用相应的instance()。
自己模仿的:
myApplication.h
- #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
- #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
- #include "myapplication.h"
- extern void print1();
- extern void print2();
- int main()
- {
- print1();
- print2();
- myApplication app("实例测试");
- print1();
- print2();
- app.printAppName();
- myApp->printAppName();
- return 0;
- }
- /*
- 测试函数,测试通过myApp输出唯一的实例名
- */
- #include "myapplication.h"
- #include <iostream>
- void print1()
- {
- if(myApp==0)
- std::cout<<"myApp没有实例化"<<std::endl;
- else
- myApp->printAppName();
- }
- /*
- 测试函数,测试通过myApp输出唯一的实例名
- */
- #include "myapplication.h"
- #include <iostream>
- void print2()
- {
- if(myApp==0)
- std::cout<<"myApp没有实例化"<<std::endl;
- else
- myApp->printAppName();
- }
0 0
- 由Qt中qApp想到的(这是单例模式么???)
- 由Qt中qApp想到的(这是单例模式么???)
- 关于qt中qApp全局变量的用法
- Qt中qApp
- Qt qApp
- QT中this指针和ui及qApp指针的区别
- QT中this指针和ui及qApp指针的区别
- 由本子想到的
- 由忧郁想到的
- 由电车男想到的
- 由MBV想到的
- 由“枣子”想到的
- 由 setMeidatime() 想到的
- 由ff想到的
- 由HelloWorld想到的
- 由观察想到的
- 由面试想到的
- 由自行车想到的......
- Java解惑读书笔记系列
- (2)单链表(Java)
- 贪心算法—杭电1051 Wooden Sticks
- Ganglia离线安装笔记
- 学习笔记_java web——JSP动作标签
- 由Qt中qApp想到的(这是单例模式么???)
- Eclipse默认标签TODO,XXX,FIXME和自定义标签
- 不同数据库的参数化SQL语句的写法
- The JRE could not be found ,Edit server and change teh JRE location!
- Sping工厂属性注入
- 38 查询Linux的命令执行退出状态
- 动态修改actionbar图标
- 不可不知的百度收录和有效索引
- 服务器无法处理请求。 ---> 索引和长度必须引用该字符串内的位置。 参数名: length