《Qt設計DLL》之使用Q_D指標指向私有成員和Q_Q指標指向公開成員
阿新 • • 發佈:2021-01-08
使用Q_D指標指向私有成員和Q_Q指標指向公開成員
開發DLL為什麼要使用Q_D/Q_Q指標?
假如,我們要把下面這個類封裝成DLL:
class MyClass
{
public:
MyClass();
~MyClass();
private:
int myVar;
};
顯然,這個私有成員myVar是我們不想給第三方看到的,而且是程式碼二進位制相容性的大敵。所以我們使用Q_D指標和Q_D指標,對該私有成員myVar進行私有化。
1、使用d_ptr指標指向MyClass的私有成員
我們定義一個私有類MyClassPrivate,並配合Q_DECLARE_PRIVATE巨集,以定義指標d_ptr指向該私有類。
class MyClassPrivate;
class MyClass
{
public:
MyClass();
~MyClass();
private:
MyClassPrivate * const d_ptr;
Q_DECLARE_PRIVATE(MyClass);
};
然後,我們把MyClass類中該隱藏的變數塞到私有類MyClassPrivate中,下面展示私有類MyClassPrivate的實現:
class MyClassPrivate
{
public:
MyClassPrivate(MyClass *parent);
private:
MyClass * const q_ptr;
Q_DECLARE_PUBLIC(MyClass);
int myVar;
};
2、使用q_ptr指標指向MyClass的公有成員
從私有類MyClassPrivate的實現程式碼可以看到,我們在私有類中,配合Q_DECLARE_PUBLIC巨集來定義q_ptr指標指向MyClass的公有成員。
以上就是Qt使用Q_D和Q_Q指標私有實現的基本方法,下面給出一個比較完整的例子:
[ myclass.h]
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtCore/QObject>
class MyClassPrivate;
class MyClass: public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent = 0);
virtual ~MyClass();
void dummyFunc();
signal:
void dummySignal();
private:
MyClassPrivate * const d_ptr = nullptr;
Q_DECLARE_PRIVATE(MyClass);
Q_DISABLE_COPY(MyClass);//防止指標d_ptr的二次釋放
};
#endif // MYCLASS_H
[myclass.cpp]
#include "myclass.h"
class MyClassPrivate : public QObject
{
public:
MyClassPrivate(MyClass *parent)
: q_ptr(parent)
{
}
void foobar()
{
Q_Q(MyClass);
emit q->dummySignal();
}
private:
MyClass * const q_ptr;
Q_DECLARE_PUBLIC(MyClass);
};
MyClass::MyClass(QObject *parent)
: QObject(parent)
, d_ptr(new MyClassPrivate(this))
{
}
MyClass::~MyClass()
{
Q_D(MyClass);
delete d;
}
void MyClass::dummyFunc()
{
Q_D(MyClass);
d->foobar();
}