Re: [問題] 新手關於 #include 的問題
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: 沒那麼單純喔~
: 假設原本的 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
: };
回文賺點文章數 (咦)
以上面的例子來看,通常的寫法應該如同下面的狀況
: b.h:
class A;
: class B {
: private:
: // A my_a_obj;
A *my_a_obj;
: public:
: void do_something(); // do something with my_a_obj;
void maybe_do_more( A *a);
: };
: 然後 foo.cpp 用到 b.h
// We don't need a.h because my_a_obj is a pointer
: // #include <a.h> // because B uses A as its member
: #include <b.h>
: void foo(){
: B somb_b_obj;
: some_b_obj.do_something();
: }
這個時候有個 bar.cpp 也用到 b.h 如下
#include <a.h> // We use a because we want to allocate A
#include <b.h>
void bar() {
B some_b;
A some_a;
b.maybe_do_more( &some_a);
}
上面兩個例子,若更改 a.h 則只有 bar.cpp 需要重編,
這部分在專案越大省的時間越多
至於加入 c.h 怎麼辦?
class C;
: class B {
: private:
: // A my_a_obj;
: // C my_c_obj;
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
: };
其實兩個檔都不用動的,因為 pointer 大小不隨 class 而變
因此 compiler 只需要知道它的名字就可以了
也就是你之前講的 forward declaration
: 很不幸的,foo.cpp 雖然完全沒呼叫到新功能
: 也根本不知道 my_c_obj 的存在
: 但因為 B 物件的成員變了
: 所以你一定要在 foo.cpp 中去 include c.h
: 不然編不過去
所以基本上除非是 value class 不然的話我們都會把標頭分開
: 那麼 foo.cpp 是不是又要把 #include <a.h> 這一行拿掉?
: 即使他呼叫 do_something() 的方式完全都一樣
foo.cpp 的確不該為他不知道的東西付出代價
所以才有以上的方法
: 所以說
: 在 header 中引入 header 是必要的
: 照理來說 B class 若只有實作層次上的改變
: 那依賴它的 foo.cpp 應該也不需要修改
: 只需要重新編譯
同上,我認為是不必要的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 175.180.111.210
※ 編輯: Ebergies 來自: 175.180.111.210 (04/08 23:16)
推
04/08 23:18, , 1F
04/08 23:18, 1F
→
04/08 23:19, , 2F
04/08 23:19, 2F
→
04/08 23:20, , 3F
04/08 23:20, 3F
→
04/08 23:22, , 4F
04/08 23:22, 4F
→
04/08 23:23, , 5F
04/08 23:23, 5F
→
04/08 23:23, , 6F
04/08 23:23, 6F
→
04/08 23:24, , 7F
04/08 23:24, 7F
→
04/08 23:25, , 8F
04/08 23:25, 8F
→
04/08 23:25, , 9F
04/08 23:25, 9F
→
04/08 23:26, , 10F
04/08 23:26, 10F
→
04/08 23:26, , 11F
04/08 23:26, 11F
→
04/08 23:29, , 12F
04/08 23:29, 12F
推
04/08 23:30, , 13F
04/08 23:30, 13F
→
04/08 23:30, , 14F
04/08 23:30, 14F
→
04/08 23:30, , 15F
04/08 23:30, 15F
→
04/08 23:31, , 16F
04/08 23:31, 16F
→
04/08 23:31, , 17F
04/08 23:31, 17F
→
04/08 23:31, , 18F
04/08 23:31, 18F
→
04/08 23:34, , 19F
04/08 23:34, 19F
→
04/08 23:36, , 20F
04/08 23:36, 20F
→
04/08 23:36, , 21F
04/08 23:36, 21F
→
04/08 23:41, , 22F
04/08 23:41, 22F
→
04/08 23:42, , 23F
04/08 23:42, 23F
→
04/08 23:43, , 24F
04/08 23:43, 24F
→
04/08 23:44, , 25F
04/08 23:44, 25F
→
04/08 23:44, , 26F
04/08 23:44, 26F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 4 之 10 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章