※ 引述《avhacker (我想把整片天空打開)》之銘言:
: Style II 其實是多此一舉,結果是一樣的.
: 正確的概念應該是你必需要 include 你所需需要的檔,而且不能多 include,
: 要自給自足。
: 像你的 oooo8.h 裡的 class D 並沒有真正用到 B, 而是用到 B&, 所以只要
: 一個前置宣告就行了;真正用到 B 實體應該是在 oooo8.cpp
: 所謂 include 而且只 include 所需的檔,意思是:
: // A.h
: class A{};
: // B.h
: class B{ void fun(); };
: // C.h
: #include B.h
: class A; // 前置宣告
: class C{
: A* pA; // 不需 include A.h, 只需一個前置宣告
: B b; // 需要 B 的實體,所以要 #include B.h
: void fun();
: };
: // C.cpp
: #include B.h
: #include A.h
: void C::fun(){
: pA = new A; // 真正用到 A, 所以要 #include A.h
: b.fun(); // 用到 B, 所以要 #include B.h
: }
: // main.cpp
: #include B.h
: #include C.h
: int main()
: {
: B b; // 用到 B, #include B.h
: C c; // 用到 C, #include C.h,
: return 0;
: }
: 此例中即使 C.h 已經 #include B.h,但我們仍要再將 B.h 引入,不能
: 依靠 C.h 已經引入 B.h 這件事,否則哪天 C.h 有所修改,不再需要引
: 入 B.h, 而這個修改竟會導至 main.cpp compile 不過,並不合理.
: 總之,每個編譯單元自給自足,就不會因為過高相依性的問題而導至某
: 些檔案莫名奇妙的 compile 過,某天又突然不過的問題。當然相依性太
: 高還會導至其他問題就是了。
原來 宣告 與 include 差別是在這邊的喔
本來小弟都還搞不通到底為什麼有時要宣告有時又不要宣告的
但我想要了解說,為什麼這種情況要宣告,而這種情況要include。
我沒什麼概念的情況下,我試著去解釋它的原理看看,然後就要有勞先進們
幫小弟看看了。
my explaination about why we need to 宣告:
====================================
因為如果我們有寫 A* a的話
那麼對於編譯器來說,因為只要是指標的東西,都有它固定的byte數
所以他只要把這固定byte數的空間配置出來,用來表示a這個變數即可
但是對於編譯器而言,他會不認識 "A" 這個東西是啥,
所以寫程式的人必須要加個class A; 在最前面, 如此一來編譯器在未來中讀到
跟A有關的東西時才會認識,是這樣子嗎? >"<
======================================
my explaination about why we need to include:
==========================================
譬如一個xxx.h檔與一個xxx.cpp檔會變成xxx.o檔,
所以xxx.o檔裡放的就是一堆run下去後機器可以執行的程式碼
而這些程式碼就是xxx.cpp裡面所寫的那一堆碼 Ok
那麼什麼時候是要 include xxx.h的時候呢?
就是當我們要真的使用到 xxx.o 裡面的程式碼時
譬如上面您提到的例子,我們因為在物件參數、宣告實體 都會用到建構子呀,
而用到這建構子也就是代表說你有使用到 xxx.o裡的程式碼,故 我們必須要
去include xxx.h檔,在得知此.h檔的資訊後,我們才有辦法去正確呼叫到 xxx.o裡的
程式碼
==========================================
我覺得很多方法我好像就是在閉門造車,才會不斷的在try 在摸索
但我不知道我到底觀念有沒有正確,到底摸索到的東西到底有沒有偏差
所以還是得需要各位先進們的指導了, 謝謝你們^__^y
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.225.145.74