看板 C_and_CPP 關於我們 聯絡資訊
littleshan:V板友說的那個問題 的確應該要讓b.h去include a.h 04/08 22:00
littleshan:不然萬一b.h增加了某些功能 又包含了c.h 04/08 22:00
littleshan:那所有用到b.h的檔案都要改 會死人 04/08 22:00
※ 編輯: loveme00835 來自: 140.121.197.115 (04/08 22:02)
Ebergies:樓上說的包含 c.h 問題其實是一樣的因為如果你原本就 04/08 22:12
Ebergies:用不到 c.h, 那麼用到 b.h 的檔案不用修改就可以編過 04/08 22:13
Ebergies:而如果你要用 c.h 的功能, 那本來就要去改動檔案了 04/08 22:13
沒那麼單純喔~ 假設原本的 b.h 是這樣 b.h: class B { private: A my_a_obj; public: void do_something(); // do something with my_a_obj; }; 然後 foo.cpp 用到 b.h #include <a.h> // because B uses A as its member #include <b.h> void foo(){ B somb_b_obj; some_b_obj.do_something(); } 目前看起來很 OK 可以用 過了一週 b.h 做了一些新功能,加入一個新的物件 C class B { private: A my_a_obj; C my_c_obj; public: void do_something(); // do something with my_a_obj void do_something_else(); // do somethiing with my_c_obj }; 很不幸的,foo.cpp 雖然完全沒呼叫到新功能 也根本不知道 my_c_obj 的存在 但因為 B 物件的成員變了 所以你一定要在 foo.cpp 中去 include c.h 不然編不過去 甚至又過了一個月 現在我們發現 my_a_obj 的功能我們要移掉了 原本的 do_something() 可以完全由 my_c_obj 來取代 那麼 foo.cpp 是不是又要把 #include <a.h> 這一行拿掉? 即使他呼叫 do_something() 的方式完全都一樣 所以說 在 header 中引入 header 是必要的 照理來說 B class 若只有實作層次上的改變 那依賴它的 foo.cpp 應該也不需要修改 只需要重新編譯 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.87.243
loveme00835:我還來不及跟上的說... 04/08 22:41
Ebergies:你這個是把 A, C 用變數使用的情況吧 04/08 22:56
Ebergies:一般而言都是用 pointer, 不會有這個問題 04/08 22:56
Ebergies:而如果真的要這樣用, 將 a.h/c.h include 進 b.h 04/08 22:57
Ebergies:會比較好 (因為顯然單獨編 b.h 根本不可能編過) 04/08 22:58