推 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