Qt源碼解析(1)

本文轉自http://www.devdiv.com/home.php?mod=space&uid=15974&do=blog&id=2356

感謝原創者分享

如果你閱讀了 Qt 的源代碼,你會看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q。我們的Qt源碼之旅就從理解這些宏說起。

 

下面先看一個C++的例子。

 

Cpp代碼
  1. class Person  
  2. {  
  3. public:  
  4.     Person(){}  
  5.     ~Person(){}  
  6.     string name();  
  7.     void setName(string name);  
  8.     int age();  
  9.     void setAge(int a);  
  10. private:  
  11.     string _name;  
  12.     int _age;  
  13. };  
class Person
{
public:
	Person(){}
	~Person(){}
	string name();
	void setName(string name);
	int age();
	void setAge(int a);
private:
	string _name;
	int _age;
};

 

 

這是一個很普通的 C++ 類 Person,他有兩個屬性 name 和 age。我們試想一下,這個類要怎麼去使用呢?如果你不想給我源代碼,那麼至少也要給我一個 dll 或者其他類似的東西,並且你要把這個頭文件給我,這樣我才能把它 include 到我的代碼中使用。我只能使用你暴露給我的 public 的接口。按理說,private 的東西我是不應該知道的,但是現在我知道了!爲什麼呢?因爲我會去讀這個頭文件,我知道了,原來在 Person 中,age 就是一個 int,name 就是一個 string。這是你不希望看到的,因爲既然你把它聲明成了 private 的,就是不想讓我知道這些東西。那麼怎麼辦呢?嗯,我有一個解決方案。來看下面的代碼:

 

person.h

Cpp代碼
  1. class Person  
  2. {  
  3. public:  
  4.     Person(){}  
  5.     ~Person(){}  
  6.     string name();  
  7.     void setName(string name);  
  8.     int age();  
  9.     void setAge(int a);  
  10. private:  
  11.     PersonPrivateData *data;  
  12. };  
class Person
{
public:
	Person(){}
	~Person(){}
	string name();
	void setName(string name);
	int age();
	void setAge(int a);
private:
	PersonPrivateData *data;
};

 

persondata.cpp

Cpp代碼
  1. class PersonPrivateData  
  2. {  
  3. public:  
  4.     string name;  
  5.     int age;  
  6. };  
class PersonPrivateData
{
public:
	string name;
	int age;
};

 

 

怎麼樣?在 person.h 中看不到我是怎麼存儲的數據了吧?嗯嗯,也許你很聰明:我還可以在 persondata.cpp 中找到那些聲明啊!當然,這是C++語法規定的,我們已經左右不了——但是,我爲什麼非要把 cpp 文件一併給你呢?因爲你使用我的類庫的話完全不需要使用 cpp 文件啊。

 

這就是一種信息隱藏的方法。看上去很麻煩,原本很簡單的對 name 和 age 的訪問都不得不通過一個指針去訪問它,何必呢?其實這樣做是有好處的:

 

  • 減少頭文件的依賴。像這樣我們把數據成員都寫在 cpp 文件中,當我們需要修改數據成員的時候就只需要修改 cpp 文件。雖然都是修改,但這和修改 .h 文件是不一樣的!原因在於,如果 .h 文件發生改變,編譯器會重新編譯所有 include 了這個 .h 文件的文件。如果你這個類相當底層,那就會花費很長時間。
  • 增加類的信息封裝。這意味着你根本看不到具體數據類型,必須使用 getter 和 setter 去訪問。我們知道 C++ 有一個 typedef 語句,我定義一個數據類型 ABC,如果你看不到具體文件,你會知道這個 ABC 是 string 還是  int 麼?

這就是 C++ 的一種設計方法,被稱爲 Private Class,大約就是私有類吧!更確切地說應該是私有數據類。據說,這也是 Qt 2.x  的實現方式。但是如果你去看你的 Qt SDK 代碼,你是看不到這樣的語句的,取而代之的則是一些我們開頭所說的 Q_D 這些宏。或許你已經隱隱約約地猜到了,這些宏就是實現這個的:Private Data。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章