1. 程式人生 > 其它 >《Qt設計DLL》之使用Q_D指標指向私有成員和Q_Q指標指向公開成員

《Qt設計DLL》之使用Q_D指標指向私有成員和Q_Q指標指向公開成員

技術標籤:模組化開發c++封裝

使用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();
}