看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Ebergies (火神)》之銘言: : 標題: Re: [問題] 新手關於 #include 的問題 : 時間: Fri Apr 8 23:15:18 2011 : : 所以說 : : 在 header 中引入 header 是必要的 : : 照理來說 B class 若只有實作層次上的改變 : : 那依賴它的 foo.cpp 應該也不需要修改 : : 只需要重新編譯 : 同上,我認為是不必要的 : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 175.180.111.210 : ※ 編輯: Ebergies 來自: 175.180.111.210 (04/08 23:16) : 推 loveme00835:必要的, 當你為了->付出執行效率與閱讀時間, 會恨自己 04/08 23:18 : → loveme00835:為什麼不要寫直接一點, 重編其實還沒有比可讀性重要 04/08 23:19 : → loveme00835:該手法在存取類別成員時, 至少要透過兩層取值 04/08 23:23 : → loveme00835:pimpl->a.function() 如果對象又是指標 04/08 23:24 : → loveme00835:pimpl->a->function(), 你再玩大一點 04/08 23:25 : → loveme00835:this->pimpl->a->function() 就會造成典型的重複程式 04/08 23:25 : → loveme00835:碼過多的情形, 也為了不必要的東西佔了過多版面 04/08 23:26 : → Ebergies:其實... 我看不出來為何要先弄一個 pimpl->a 04/08 23:26 : → Ebergies:因為其實你只需要 a->function() 不就好了 04/08 23:31 : → loveme00835:恩, 我說的是開發端的實作 04/08 23:34 : → loveme00835:但從介面來看, 傳址不改值 and 傳參考卻會改值, 呼叫 04/08 23:36 : → loveme00835:叫端的閱讀也會不利 04/08 23:36 我不是很清楚你的想法 這麼說好了,前文的 Header 大概如下 // b.h class A; class B { A *obj_a; public: void do_something(); A *do_something_with( A *a); }; 你有幾點訴求 1) 效率 2) 可讀性 2.1) 典型的重複程式 2.2) 從介面來看, 傳址不改值 and 傳參考卻會改值, 呼叫端的閱讀也會不利 先看可讀性的 2.1 部分好了 以上的寫法就算在內部實作,也頂多像下面這樣 void B::do_something() { obj_a->blah(); } 如果你 B::obj_a 宣告成這樣:A obj_a; 那以上的實作便成為: void B::do_something() { obj_a.blah(); } 對我來說是沒有什麼差別... 接下來 2.2 我有點不懂,傳址就會改值啊,當做你寫傳值的筆誤好了 你可以用簡單的方法處理掉這個問題,以上面的第二個 member function 來看 你只需要如下宣告,就很清楚 const A *do_something( const A *a); 好吧,最後談到效率 的確很多時候透過指標取值的效率會有點差異 但是或許還有另一點值得注意 就是複製整個複雜的 structure 遠比複製指標還慢 一般的情況下連 string 這種小東西都有人建議多使用 const string &s 取值了 而通常我們都能夠分辨哪些東西是夠小,夠常被存取的東西 哪些東西是很大,我們不常重複的存取整份資料的東西 (Managed C++ 把它們分為 value class/ ref class) (或者你也可以用 struct 與 class 區分它們) 而就我的經驗,使用 pointer 的機會應該遠比直接存取變數情況要多得多 當然,那些情況使用 pointer 的效率比較好,程式碼也比較單純 尤其是在使用 vector 將你的 class 裝起來的時候 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.180.111.210