简单想想:实现单例时,需要考虑对象唯一,不允许用户实例化,考虑初始化时线程安全,该单例对象的释放问题。
实现单例可以从以下入手:
1:借助static静态成员变量,保证唯一。
2:禁用构造函数,提供静态成员函数初始化/获取该唯一对象。
3:考虑多线程的安全,初始化该对象前考虑加锁。
4:考虑该对象的释放,栈对象不用考虑,堆对象的释放可以借助智能指针/单例类中类析构时释放。
最近用qt比较多,看到一个好的demo,一直用,做个备份。
//interface_test.h 头文件
#ifndef INTERFACE_TEST_H
#define INTERFACE_TEST_H
#include <QScopedPointer> //qt提供的独占式智能指针,用于管理单一所有权对象。
class interface_test
{
private: //私有化
interface_test();
public:
static interface_test *Instance();
//其他对外提供的接口
int one_test(){return 1; }
private:
static QScopedPointer<interface_test> self; //注意cpp中的初始化
};
#endif // INTERFACE_TEST_H
对应的cpp文件 interface_test.cpp
//interface_test.cpp
#include "interface_test.h"
#include <QMutex>
interface_test::interface_test(){}
//局部静态变量 以及智能指针自动释放
QScopedPointer<interface_test> interface_test::self;
interface_test *interface_test::Instance()
{
if (self.isNull()) {
static QMutex mutex; //局部静态变量 第一次调用时初始化 只会初始化一次
QMutexLocker locker(&mutex);
if (self.isNull()) {
self.reset(new interface_test);
}
}
return self.data();
}
简单main函数
#include <QDebug>
#include "interface_test.h"
int main(int argc, char *argv[])
{
// interface_test test; //会报错 构造函数私有
qDebug()<<interface_test::Instance()->one_test();
return 0;
}
这个代码感觉挺好的,做个备份,至于更优(调用更简单),把单例封装成模板,借助c++宏等方案,参考Qt 单例模式的实现(4种方法) - 一杯清酒邀明月 - 博客园 (cnblogs.com)