程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 詳細說明C++編譯的編寫及其代碼問題

詳細說明C++編譯的編寫及其代碼問題

編輯:C++入門知識

為每一個軟件行業的從業人員,無論是開發人員、項目經理、還是測試人員,也要不斷適應這個趨勢,我認為C++編譯只會使我們的工作更簡單和更輕松,希望本文能教會你更多東西。

如果這是你購買的庫的設計問題,你對它無計可施除了換一個更好的庫),但你可以將你自己的代碼組織得更好一些,以求得將修改代碼後的重新編譯工作降到最少。這樣的設計會更好,更有可維護性,因為它們展示了更好的概念上的分離。

看看這個典型的面向對象的C++編譯程序例子:

  1. class Shape {  
  2.  
  3.     public:     // 使用Shapes的用戶的接口  
  4.  
  5.         virtual void draw() const;  
  6.  
  7.         virtual void rotate(int degrees);  
  8.  
  9.         // ...  
  10.  
  11.     protected:  // common data (for implementers of Shapes)  
  12.  
  13.         Point center;  
  14.  
  15.         Color col;  
  16.  
  17.         // ...  
  18.  
  19.     };  
  20.  
  21.    
  22.  
  23.     class Circle : public Shape {  
  24.  
  25.     public:   
  26.  
  27.         void draw() const;  
  28.  
  29.         void rotate(int) { }  
  30.  
  31.         // ...  
  32.  
  33.     protected:  
  34.  
  35.         int radius;  
  36.  
  37.         // ...  
  38.  
  39.     };  
  40.  
  41.    
  42.  
  43.     class Triangle : public Shape {  
  44.  
  45.     public:   
  46.  
  47.         void draw() const;  
  48.  
  49.         void rotate(int);  
  50.  
  51.         // ...  
  52.  
  53.     protected:  
  54.  
  55.         Point a, b, c;  
  56.  
  57.         // ...  
  58.  
  59.     };   

設計思想是,用戶通過Shape的public接口來操縱它們,而派生類例如Circle和Triangle)的實現部分則共享由protected成員表現的那部分實現implementation)。這不是一件容易的事情:確定哪些實現部分是對所有的派生類都有用的,並將之共享出來。

因此,與public接口相比,protected成員往往要做多得多的改動。舉例來說,雖然理論上“中心”(center)對所有的圖形都是一個有效的概念,但當你要維護一個三角形的“中心”的時候,是一件非常麻煩的事情——對於三角形,當且僅當它確實被需要的時候,計算這個中心才是有意義的。

  • 更好的理解C++編程學習與研究
  • 闡述C++的相關學習方法進行討論研究
  • 詳細說明C++中的廢料收集缺陷問題
  • 對於Visual C++開發工具進行學習指導
  • 簡述C++語言支持函數重載問題介紹

protected成員很可能要依賴於實現部分的細節,而Shape的用戶譯注:user此處譯為用戶,指使用Shape類的C++編譯,下同)卻不見得必須依賴它們。舉例來說,很多大多數?)使用Shape的代碼在邏輯上是與“顏色”無關的,但是由於Shape中“顏色”這個定義的存在,卻可能需要一堆復雜的頭文件,來結合操作系統的顏色概念。

當protected部分發生了改變時,使用Shape的代碼必須重新編譯——即使只有派生類的實現部分才能夠訪問protected成員。於是,基類中的“實現相關的信息”(information helpful to implementers)對用戶來說變成了象接口一樣敏感的東西,它的存在導致了實現部分的不穩定,用戶代碼的無謂的重編譯當實現部分發生改變時),以及將頭文件無節制地包含進用戶代碼中因為“實現相關的信息”需要它們)。有時這被稱為“脆弱的基類問題”(brittle base class problem)。

一個很明顯的解決方案就是,忽略基類中那些象接口一樣被使用的“實現相關的信息”。換句話說,使用接口,純粹的接口。也就是說,用抽象基類的方式來表示接口:

  1. class Shape {  
  2.  
  3.     public:     //使用Shapes的用戶的接口  
  4.  
  5.         virtual void draw() const = 0;  
  6.  
  7.         virtual void rotate(int degrees) = 0;  
  8.  
  9.         virtual Point center() const = 0;  
  10.  
  11.         // ...  
  12.  
  13.    
  14.  
  15.         // 沒有數據  
  16.  
  17.     };  
  18.  
  19.    
  20.  
  21.     class Circle : public Shape {  
  22.  
  23.     public:   
  24.  
  25.         void draw() const;  
  26.  
  27.         void rotate(int) { }  
  28.  
  29.         Point center() const { return center; }  
  30.  
  31.         // ...  
  32.  
  33.     protected:  
  34.  
  35.         Point cent;  
  36.  
  37.         Color col;  
  38.  
  39.         int radius;  
  40.  
  41.         // ...  
  42.  
  43.     };  
  44.  
  45.    
  46.  
  47.     class Triangle : public Shape {  
  48.  
  49.     public:   
  50.  
  51.         void draw() const;  
  52.  
  53.         void rotate(int);  
  54.  
  55.         Point center() const;  
  56.  
  57.         // ...  
  58.  
  59.     protected:  
  60.  
  61.         Color col;  
  62.  
  63.         Point a, b, c;  
  64.  
  65.         // ...  
  66.  
  67.     };   

現在,用戶對C++編譯與派生類的實現部分的變化之間的關系被隔離了。我曾經見過這種技術使得編譯的時間減少了幾個數量級。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved