您好,登錄后才能下訂單哦!
這篇文章主要介紹“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>
免責聲明:本站發(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)容。