將檔案之間的編譯依賴關係降至最低

2021-05-02 15:29:13 字數 1702 閱讀 3601

考慮這樣幾個類,a、a1、a2、b,其中a和b是要暴露給使用者的類。

1.最初組織關係如下:

//a1.h

#include

class a1

;//a.cpp

#include "a.h"

void a::dosomething()

b a::returnb()

//user.cpp

#include "a.h"

int main()

因此,user.cpp 中直接或間接的include了a.h b.h a1.h a2.h,而且user根本不知道已經include了 這麼多.h,尤其是不知道已經include了b.h。因此,如果與介面無關型別a1.h和a2.h改變了,會導致user.cpp重新編譯。

2.利用指標/引用進行實現之:

a1.h a2.h b.h不用更改。

//a.h

class a1;

class a2;

class b;

class a

;//a.cpp

#include "a.h"

#include "a1.h"

#include "a2.h"

#include "b.h"

void a::dosomething()

b a::returnb()

//user.cpp

#include "a.h"

#include "b.h"//顯示指明我要你

int main()

//此時user.cpp只是包含了a.h 和 b.h,因此a1.h和a2.h修改的時候,user.cpp不用再重新編譯。但是user可以看到a.h裡含有a1,a2這些毫無意義的東西,這樣的話,是暴露了其內部實現,因此我們納入乙個新的類aimpl來消滅這個暴露狂。

3.實現aimpl,將a變成乙個handle class

a1.h a2.h b.h不變。

//aimpl.h  //真是臃腫,懶得寫aimpl.cpp了

#include "a1.h"

#include "a2.h"

#include "b.h"

class aimpl

b returnb()

private:

a1 _a1;

a2 _a2;

};//a.h

class aimpl;

class b;

class a

;//a.cpp

#include "a.h"

#include "aimpl.h"

#include "b.h"

void a::dosomething()

b a::returnb()

//user.cpp不變,但是這次他看到的a.h就沒有_a1和_a2這些東西了~~~~

以上這類方法叫做handle class,不過我怎麼覺得沒什麼大用啊,c++標準庫里有應用嗎?誰知道,麻煩告訴小弟聲~~~

另外effective c++裡還有另外一種方法,叫做protocal class,相貌如下:

class aprotocal

所以實現也就不言自明了,另外比較高階的實現方法,就是將a public繼承乙個介面類,並private 繼承乙個實現類,具體見書本吧。

條款31 將檔案間的編譯依存關係降至最低

條款31 將檔案間的編譯依存關係降至最低 minimize compilation dependencies between files.內容 在你們的開發團隊中,一些有經驗的工程師時不時地會教導新手一些基本的程式設計原則,其中 將介面從實現中 分離 可能是他 她 要你必須牢記原則,因為c 並沒有把...

c 將檔案之間編譯關係降到最低

類的定義式 類的定義,可以知道類的大小 類的實現 類的宣告 類的宣告,表明,使用此類,編譯不會出錯 c 並沒有把 將介面從實現中分離 做得很好。class的定義式不只詳細敘述了class介面,還包括十足的實現序幕。如 class person public person const string n...

降低檔案之間的編譯依賴性

當乙個類裡面有別的檔案中定義的型別的成員物件的時候,這兩個檔案一般來說,就有了依賴性。例如 widgeta.h class widgeta class widgetb 使用widgetb的時候我們需要包含widgeta.h標頭檔案,否則編譯器會告訴你找不到定義,所以我們一般會在widgetb.h的頭...