精華區beta Programming 關於我們 聯絡資訊
※ 引述《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