本文根据一个例子,展示如何在QT中使用单例模式
特点:
全局内只允许创建一个对象,成员变量和成员函数绝大多数为静态。
用途:
充当架构内的全局管理器角色,例如Windows的任务管理器就是一个典型的单例模式。
单例模式代码:
//运动控制器 单例模式
#define SAFE_DELETE_ELEMENT( ptr ) if(ptr != NULL){delete ptr; ptr = NULL;}
class MoveController : public QObject
{
Q_OBJECT
static QMutex mutex;
static Wheel* wheel1;
static Wheel* wheel2;
static MoveController* instance;
public:
~MoveController(){
SAFE_DELETE_ELEMENT(instance)
}
static MoveController* getInstance(){
QMutexLocker locker(&mutex);
if(instance == NULL)
instance = new MoveController();
return instance;
}
public:
static bool init();
static Wheel* getWheel1(){
return wheel1;
}
static Wheel* getWheel2(){
return wheel2;
}
private:
MoveController(){}
signals:
void mySignal(QString);
private slots:
void mySlot(QString);
};
注1:
需在类外(.cpp中)对静态成员进行定义:
//静态成员类外定义
QMutex MoveController::mutex;
SteerWheel* MoveController::wheel1 = NULL;
SteerWheel* MoveController::wheel2 = NULL;
MoveController* MoveController::instance = NULL;
注2:
类外(其他类中)访问成员函数方的两种方式:
MoveController::init(); //通过类名访问
MoveController.getInstance()->init(); //通过唯一实例访问
注3:
涉及到信号槽连接,用实例指针代替this指针:
connect(wheel1,SIGNAL(addDebug_signal(QString)),getInstance(),SLOT(addDebug_slot(QString)));