qt 实现单例
2014-02-11 09:12
239 查看
头文件:
class ConnectionManager
{
public:
static ConnectionManager *instance();
};
实现文件:
Q_GLOBAL_STATIC(ConnectionManager, connectionManager)
ConnectionManager *ConnectionManager::instance()
{
return connectionManager();
}
使用:
ConnectionManager::instance()
// POD for Q_GLOBAL_STATIC
template <typename T>
class QGlobalStatic
{
public:
QBasicAtomicPointer<T> pointer;
bool destroyed;
};
// Created as a function-local static to delete a QGlobalStatic<T>
template <typename T>
class QGlobalStaticDeleter
{
public:
QGlobalStatic<T> &globalStatic;
QGlobalStaticDeleter(QGlobalStatic<T> &_globalStatic)
: globalStatic(_globalStatic)
{ }
inline ~QGlobalStaticDeleter()
{
delete globalStatic.pointer;
globalStatic.pointer = 0;
globalStatic.destroyed = true;
}
};
#define Q_GLOBAL_STATIC_INIT(TYPE, NAME) \
static QGlobalStatic<TYPE > this_##NAME = { Q_BASIC_ATOMIC_INITIALIZER(0), false }
#define Q_GLOBAL_STATIC(TYPE, NAME) \
Q_GLOBAL_STATIC_INIT(TYPE, NAME); \
static TYPE *NAME() \
{ \
if (!this_##NAME.pointer && !this_##NAME.destroyed) { \
TYPE *x = new TYPE; \
if (!this_##NAME.pointer.testAndSetOrdered(0, x)) \
delete x; \
else \
static QGlobalStaticDeleter<TYPE > cleanup(this_##NAME); \
} \
return this_##NAME.pointer; \
}
Q_GLOBAL_STATIC:
1、先通过Q_GLOBAL_STATIC_INIT声明一个静态的全局变量(this_##NAME ),并初始化为0
2、声明一个名字叫做全局变量(NAME)的static的函数,用来取得这个全局变量
3、如果这个变量没初始化且没删除,就通过testAndSetOrdered以原子方式创建
4、创建成功,再定义一个函数内的QGlobalStaticDeleter来清理这个全局变量
5、函数返回最后结果
qt在每个arch上面都实现了原子操作,移植时候修改src/corelib/arch/qatomic_ARCH.h
参考文档: Implementing Atomic Operations
class ConnectionManager
{
public:
static ConnectionManager *instance();
};
实现文件:
Q_GLOBAL_STATIC(ConnectionManager, connectionManager)
ConnectionManager *ConnectionManager::instance()
{
return connectionManager();
}
使用:
ConnectionManager::instance()
// POD for Q_GLOBAL_STATIC
template <typename T>
class QGlobalStatic
{
public:
QBasicAtomicPointer<T> pointer;
bool destroyed;
};
// Created as a function-local static to delete a QGlobalStatic<T>
template <typename T>
class QGlobalStaticDeleter
{
public:
QGlobalStatic<T> &globalStatic;
QGlobalStaticDeleter(QGlobalStatic<T> &_globalStatic)
: globalStatic(_globalStatic)
{ }
inline ~QGlobalStaticDeleter()
{
delete globalStatic.pointer;
globalStatic.pointer = 0;
globalStatic.destroyed = true;
}
};
#define Q_GLOBAL_STATIC_INIT(TYPE, NAME) \
static QGlobalStatic<TYPE > this_##NAME = { Q_BASIC_ATOMIC_INITIALIZER(0), false }
#define Q_GLOBAL_STATIC(TYPE, NAME) \
Q_GLOBAL_STATIC_INIT(TYPE, NAME); \
static TYPE *NAME() \
{ \
if (!this_##NAME.pointer && !this_##NAME.destroyed) { \
TYPE *x = new TYPE; \
if (!this_##NAME.pointer.testAndSetOrdered(0, x)) \
delete x; \
else \
static QGlobalStaticDeleter<TYPE > cleanup(this_##NAME); \
} \
return this_##NAME.pointer; \
}
Q_GLOBAL_STATIC:
1、先通过Q_GLOBAL_STATIC_INIT声明一个静态的全局变量(this_##NAME ),并初始化为0
2、声明一个名字叫做全局变量(NAME)的static的函数,用来取得这个全局变量
3、如果这个变量没初始化且没删除,就通过testAndSetOrdered以原子方式创建
4、创建成功,再定义一个函数内的QGlobalStaticDeleter来清理这个全局变量
5、函数返回最后结果
qt在每个arch上面都实现了原子操作,移植时候修改src/corelib/arch/qatomic_ARCH.h
参考文档: Implementing Atomic Operations
相关文章推荐
- Qt中Ui名字空间以及setupUi函数的原理和实现
- QT+树莓派实现一个简单的播放器
- Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel
- QT 线程池 + TCP 小试(一)线程池的简单实现
- Qt通过QNetworkAccessManager实现Http网络通信
- Qt实现图片旋转
- Qt动态布局,多个窗口使用同一个widget如何实现。
- QT 利用ListWidget 和 StackedLayout 配合实现 分页 选项
- Qt 登陆界面实现
- Qt 实现多级菜单
- 剖析 Qt 实现动画状态机实例
- Qt 实现listWidget中项的检索
- Qt通过UDP传图片,实现自定义分包和组包
- 原创 Qt之美(一):D指针/私有实现 收藏 此文于2010-12-01被推荐到CSDN首页 如何被推荐? The English version is available at: http://xizhizhu.blogspot.com/2010/
- qt实现无缝滚动字幕,刷新间隔任意调节
- Qt5:Qt中屏幕或窗口截图功能的实现
- Qt工程中c++实现wrl到pcd格式转换
- qt实现文件浏览器
- 在windows平台上使用Qt和libmodbus库实现modbus主机功能
- QT实现屏幕滑动效果窗体