※ 引述《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