一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Qt之美(一):D指針/私有實(shí)現(xiàn)

 orion360doc 2010-12-05
相信不少剛開始閱讀Qt源代碼的朋友在看到其中的Private類和諸如Q_D、Q_Q等宏時(shí)都會(huì)思考,為什么Qt要用這樣一個(gè)設(shè)計(jì)模式呢?這樣一段增加了不少復(fù)雜度的代碼,到底有多大的好處呢?簡(jiǎn)單的說,這樣的好處在于保證代碼的二進(jìn)制兼容性。
什么是二進(jìn)制兼容性?大名鼎鼎的KDE項(xiàng)目是這樣介紹的:一個(gè)庫是二進(jìn)制兼容的,如果一個(gè)程序和某個(gè)庫的某個(gè)版本動(dòng)態(tài)鏈接,并且不需要重新編譯,即可在安裝有該庫較新版本的環(huán)境中運(yùn)行。為什么要保證二進(jìn)制兼容性?如果不能保證庫的二進(jìn)制兼容性,就意味著每次發(fā)布新版本時(shí),依賴該庫的所有程序都必須重新編譯才能正常運(yùn)行。顯然,這對(duì)于像Qt這樣被廣泛采用的庫而言是完全不可接受的。關(guān)于二進(jìn)制兼容性的更多信息,感興趣的朋友可以參考下KDE TechBase上的這篇文章,這里就不羅嗦了,僅僅和大家分享下具體的使用。
如果不使用D指針,那我們可能會(huì)有如下的一個(gè)類聲明:
class MyClass  
{  
public:  
  MyClass();  
  ~MyClass();  
private:  
  int myVar;  
}; 
class MyClass
{
public:
  MyClass();
  ~MyClass();
private:
  int myVar;
};
顯然,這里的私有成員myVar是保證代碼二進(jìn)制兼容性的大敵,所以我們需要使用D指針,改寫這個(gè)類:
class MyClassPrivate;  
class MyClass  
{  
public:  
  MyClass();  
  ~MyClass();  
private:  
  MyClassPrivate * const d_ptr;  
  Q_DECLARE_PRIVATE(MyClass);  
}; 
class MyClassPrivate;
class MyClass
{
public:
  MyClass();
  ~MyClass();
private:
  MyClassPrivate * const d_ptr;
  Q_DECLARE_PRIVATE(MyClass);
};
這里,我們定義了一個(gè)指針d_ptr指向私有實(shí)現(xiàn)類,然后用Q_DECLARE_PRIVATE宏來定義一些輔助函數(shù)和聲明友元類:
#define Q_DECLARE_PRIVATE(Class) \  
    inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \  
    inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \  
    friend class Class##Private; 
#define Q_DECLARE_PRIVATE(Class) \
    inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
    inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
    friend class Class##Private;
然后這個(gè)私有類的實(shí)現(xiàn)如下所示:
class MyClassPrivate  
{  
public:  
  MyClassPrivate(MyClass *parent);  
private:  
  MyClass * const q_ptr;  
  Q_DECLARE_PUBLIC(MyClass);  
  int myVar;  
}; 
class MyClassPrivate
{
public:
  MyClassPrivate(MyClass *parent);
private:
  MyClass * const q_ptr;
  Q_DECLARE_PUBLIC(MyClass);
  int myVar;
};
這里的q_ptr指針就是指向公開的接口了,然后Q_DECLARE_PUBLIC宏則定義了輔助函數(shù)并聲明了友元類:
#define Q_DECLARE_PUBLIC(Class)                                    \  
    inline Class* q_func() { return static_cast<Class *>(q_ptr); } \  
    inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \  
    friend class Class; 
#define Q_DECLARE_PUBLIC(Class)                                    \
    inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
    inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \
    friend class Class;
而我們還可以用Q_D和Q_Q兩個(gè)宏來進(jìn)一步簡(jiǎn)化訪問:
#define Q_D(Class) Class##Private * const d = d_func()  
#define Q_Q(Class) Class * const q = q_func() 
#define Q_D(Class) Class##Private * const d = d_func()
#define Q_Q(Class) Class * const q = q_func()
這就是Qt中D指針/私有實(shí)現(xiàn)的最基本使用方法。最后用一個(gè)比較完整的例子作為結(jié)尾;)
// 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;  
  Q_DECLARE_PRIVATE(MyClass);  
  Q_DISABLE_COPY(MyClass);  
};  
#endif // MYCLASS_H  
// myclass.cpp  
#include "myclass.h"  
class MyClassPrivate  
{  
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();  
 
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zhu_xz/archive/2010/11/25/6035861.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本99精品在线观看| 99久久婷婷国产亚洲综合精品| 久久婷婷综合色拍亚洲| 能在线看的视频你懂的| 中日韩美一级特黄大片| 亚洲一区二区三区三区| 成人午夜免费观看视频| 在线观看视频日韩精品| 国产高清一区二区不卡| 国产亚洲神马午夜福利| 国产免费操美女逼视频| 91人妻丝袜一区二区三区| 操白丝女孩在线观看免费高清| 国产超碰在线观看免费| 日韩欧美综合在线播放| 国产精品乱子伦一区二区三区| 成人精品日韩专区在线观看| 美女被后入视频在线观看| 中文字幕乱码一区二区三区四区| 欧美日韩有码一二三区| 开心久久综合激情五月天| 欧美一区二区三区十区| 不卡视频在线一区二区三区| 欧美日韩国产精品第五页| a久久天堂国产毛片精品| 午夜精品麻豆视频91| 亚洲精品福利视频在线观看| 永久福利盒子日韩日韩| 欧美特色特黄一级大黄片| 欧美日韩国产自拍亚洲| 美女露小粉嫩91精品久久久| 91播色在线免费播放| 九九热视频免费在线视频| av一区二区三区天堂| 欧美黑人在线精品极品| 色综合伊人天天综合网中文| 久久碰国产一区二区三区| 日韩高清中文字幕亚洲| 91免费精品国自产拍偷拍| 日韩av生活片一区二区三区| 一区二区在线激情视频|