看板 C_and_CPP 關於我們 聯絡資訊
: 我不是很清楚你的想法 : 這麼說好了,前文的 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(); : } : 對我來說是沒有什麼差別... 我的意思是指這裡雖然免除了引入 a.h, 到後來龜毛一點你可能更 進一步為了免除所有引入 b.h的client必須做的修改, 用了pimpl idom, 類別 b的規格變成這樣: - // b.h class A; class Pimpl; class B { Pimpl *objs; public: void do_something(); A *do_something_with( A *a); }; - // b.cpp #include "b.h" struct Pimpl { A a; C c; D *d; // 更多成員 ... }; // 其他實作碼 void B::do_something() { objs->c.method(); objs->d->method(); } 實作碼這時候就會變得複雜, 但是所減少的編譯成本還比你的方法 來得多 : 接下來 2.2 我有點不懂,傳址就會改值啊,當做你寫傳值的筆誤好了 : 你可以用簡單的方法處理掉這個問題,以上面的第二個 member function 來看 : 你只需要如下宣告,就很清楚 : const A *do_something( const A *a); 沒有筆誤, 假如你開發的類別長這樣: class YourClass { void DoSomething( A const *a ); void DoOtherThing( A &a ); }; 而同事開發的類別: class MyClass { void DoSomething( A const &a ); void DoOtherThing( A *a ); }; 然後在使用上: A a; YourClass yours; MyClass mine; yours.DoSomething( &a ); yours.DoOtherThing( a ); mine.DoSomething( a ); mine.DoOtherThing( &a ); 然後我跟你說, 其實 DoSomething 只是將 a 當做 in parameter, DoOtherThing 將 a 當做 out parameter, 而這些在方法名稱上都 看不出來, 下面的程式碼較為符合從C語言繼承下來的呼叫習慣. : 好吧,最後談到效率 : 的確很多時候透過指標取值的效率會有點差異 : 但是或許還有另一點值得注意 : 就是複製整個複雜的 structure 遠比複製指標還慢 : 一般的情況下連 string 這種小東西都有人建議多使用 const string &s 取值了 這就像我說的 pointer to non-const & reference to const 遠比 pointer to const & reference to non-const 來得好, 不只有你開發端的地方要注意, 客戶的使用也要考慮進來 , 強迫客戶用 by reference 語法來傳遞引數, 以達成 by value 語意是相當不自然的. 但是你就算選擇了第一個方案, 還會面臨到介面在呼叫起來不方便 的問題, 引數一下要加 &一下又不用加(但比較建議). 你改到通通都不加也不是一件好事, 因為這樣就無法一眼就看出函 式的行為是何種, 還記得7 +- 2 法則嗎?你讓讀者背的東西愈多, 程式碼的品質也愈差. : 而通常我們都能夠分辨哪些東西是夠小,夠常被存取的東西 : 哪些東西是很大,我們不常重複的存取整份資料的東西 : (Managed C++ 把它們分為 value class/ ref class) : (或者你也可以用 struct 與 class 區分它們) : 而就我的經驗,使用 pointer 的機會應該遠比直接存取變數情況要多得多 : 當然,那些情況使用 pointer 的效率比較好,程式碼也比較單純 : 尤其是在使用 vector 將你的 class 裝起來的時候 -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
legnaleurc:我覺得你舉的例子有點極端, 一般來說協作時其介面的風 04/09 01:24
legnaleurc:格不太可能會差那麼多, 除非真的只是個內部 helper 04/09 01:25
那也要有內部標準才行呀 XD
legnaleurc:那種問題其實跟 pimpl 沒關係吧 04/09 01:25
其實我一開始是回錯, 見笑了. 囧 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/09 01:27)