在Qt框架中,单例模式的实现是一个常见的需求,它有多种实现方式,每种都有其特点。以下是对这些方法的探讨,包括宏定义方式、模板类方式,以及Qt的内置单例宏,并附有具体的使用示例。
宏定义方式的单例模式
宏定义方式是一种传统且直接的实现单例模式的方法,但它可能导致代码重复和类型安全性问题。以下是一个宏定义单例模式的示例:
宏定义示例:
// QtSingleton.h
#ifndef QTSINGLETON_H
#define QTSINGLETON_H
#include <QScopedPointer>
#include <QMutex>
#define SINGLETON_DECL(Class) \
public: \
static Class *Instance(); \
private: \
Q_DISABLE_COPY(Class) \
static QScopedPointer<Class> self;
#define SINGLETON_IMPL(Class) \
QScopedPointer<Class> Class::self; \
Class *Class::Instance() { \
if (self.isNull()) { \
static QMutex mutex; \
QMutexLocker locker(&mutex); \
if (self.isNull()) { \
self.reset(new Class); \
} \
} \
return self.data(); \
}
#endif // QTSINGLETON_H
使用示例:
// MyClass.h
class MyClass {
// MyClass 定义
};
// MyClass.cpp
SINGLETON_IMPL(MyClass)
// 使用单例
MyClass* instance = MyClass::Instance();
模板类方式的单例模式
模板类方式提供了更高的灵活性、类型安全性和代码重用性。以下是使用模板类实现单例模式的示例:
模板类示例:
// QtSingletonTemplate.h
#ifndef QTSINGLETONTEMPLATE_H
#define QTSINGLETONTEMPLATE_H
#include <QScopedPointer>
#include <QMutex>
template<typename T>
class QtSingletonTemplate {
public:
static T* Instance() {
if (m_instance.isNull()) {
static QMutex mutex;
QMutexLocker locker(&mutex);
if (m_instance.isNull()) {
m_instance.reset(new T);
}
}
return m_instance.data();
}
private:
QtSingletonTemplate() = default;
~QtSingletonTemplate() = default;
QtSingletonTemplate(const QtSingletonTemplate &) = delete;
QtSingletonTemplate& operator=(const QtSingletonTemplate &) = delete;
static QScopedPointer<T> m_instance;
};
template<typename T>
QScopedPointer<T> QtSingletonTemplate<T>::m_instance;
#endif // QTSINGLETONTEMPLATE_H
使用示例:
// MyClass.h
class MyClass {
// MyClass 定义
};
// 使用单例
MyClass* instance = QtSingletonTemplate<MyClass>::Instance();
Qt内置单例宏
Qt的 Q_GLOBAL_STATIC
宏提供了一个简洁且线程安全的单例实现方式,非常适合需要全局访问的对象。
内置宏示例:
class MyClass {
public:
void myFunction();
// ... 其他成员 ...
};
Q_GLOBAL_STATIC(MyClass, myGlobalInstance)
void someFunction() {
myGlobalInstance()->myFunction();
}
使用示例:
// 在任何需要的地方
myGlobalInstance()->myFunction();
每种方法都有其适用场景和优缺点。宏定义方式适合快速实现单例,但可能导致代码重复;模板类方式更灵活、安全,适合多类单例场景;而Qt内置单例宏简洁且线程安全,适用于全局单例对象。开发者可以根据项目需求和上下文选择最合适的实现方式。
标签:Qt,示例,instance,深入,单例,MyClass,Class,QtSingletonTemplate From: https://www.cnblogs.com/linxmouse/p/17879587.html