考慮這樣幾個類,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的頭...