中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++編譯的編寫及其代碼問題分析

發布時間:2021-11-29 16:24:16 來源:億速云 閱讀:162 作者:iii 欄目:編程語言

這篇文章主要介紹“C++編譯的編寫及其代碼問題分析”,在日常操作中,相信很多人在C++編譯的編寫及其代碼問題分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++編譯的編寫及其代碼問題分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

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

class Shape {       public:     // 使用Shapes的用戶的接口           virtual void draw() const;           virtual void rotate(int degrees);           // ...       protected:  // common data (for implementers of Shapes)           Point center;           Color col;           // ...       };           class Circle : public Shape {       public:            void draw() const;           void rotate(int) { }           // ...       protected:           int radius;           // ...       };           class Triangle : public Shape {       public:            void draw() const;           void rotate(int);           // ...       protected:           Point a, b, c;           // ...       };

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

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

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

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

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

class Shape {       public:     //使用Shapes的用戶的接口           virtual void draw() const = 0;           virtual void rotate(int degrees) = 0;           virtual Point center() const = 0;           // ...               // 沒有數據       };           class Circle : public Shape {       public:            void draw() const;           void rotate(int) { }           Point center() const { return center; }           // ...       protected:           Point cent;           Color col;           int radius;           // ...       };           class Triangle : public Shape {       public:            void draw() const;           void rotate(int);           Point center() const;           // ...       protected:           Color col;           Point a, b, c;           // ...       };

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

到此,關于“C++編譯的編寫及其代碼問題分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

称多县| 宁波市| 云梦县| 珲春市| 宣汉县| 屏东县| 金湖县| 砀山县| 罗江县| 壤塘县| 富平县| 大足县| 菏泽市| 华安县| 铜山县| 临江市| 昌平区| 类乌齐县| 湟源县| 崇信县| 西丰县| 密云县| 伽师县| 淮南市| 诸城市| 商都县| 吴堡县| 香河县| 宁乡县| 昔阳县| 乳山市| 宜兰市| 桦南县| 井研县| 霍城县| 高碑店市| 吉安市| 常德市| 永昌县| 贡山| 海盐县|