溫馨提示×

溫馨提示×

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

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

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

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

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

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

看看這個典型的面向?qū)ο蟮?span >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)的實現(xiàn)部分則共享由protected成員表現(xiàn)的那部分實現(xiàn)(implementation)。這不是一件容易的事情:確定哪些實現(xiàn)部分是對所有的派生類都有用的,并將之共享出來。

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

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

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

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

class Shape {       public:     //使用Shapes的用戶的接口           virtual void draw() const = 0;           virtual void rotate(int degrees) = 0;           virtual Point center() const = 0;           // ...               // 沒有數(shù)據(jù)       };           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;           // ...       };

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

到此,關(guān)于“C++編譯的編寫及其代碼問題分析”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

c++
AI