看板 C_and_CPP 關於我們 聯絡資訊
「沒有人比Person更了解兩個Person物件該怎麼比較」 比較好的方式是把比較的函式定義為成員函式, 分為靜態和非靜態 兩種, 推文中 littleshan 大提出的實作像是這樣: class Person { private: std::string name; public: static int compare( Person const &lhs, Person const &rhs ) { return lhs.name.compare( rhs.name ); } }; compare 函式回傳出來的結果就和標準庫中 strcmp、memcmp 一樣, 接著你再依照想要的行為, 製作出 Binary Predicate Function: bool PersonLessThan( Person const &lhs, Person const &rhs ) { return Person::compare( lhs, rhs ) < 0; } 然後以下面的形式呼叫 std::sort: std::sort( people.begin(), people.end(), PersonLessThan ); 非靜態的方式定義起來也差不多, 呼叫的時候也只差一點點: class Person { private: std::string name; public: int compare( Person const &target ) const { return name.compare( target.name ); } }; bool PersonLessThan( Person const &lhs, Person const &rhs ) { return lhs.compare( rhs ) < 0; } 我比較偏好這種形式, 因為比較像英文的文法而且主動被動容易分 清楚. 走火入魔的話也可以改用仿函式(Functor/Function Object), 或是 重載各種比較的運算子(參考<utility>裡的rel_ops命名空間),前者 想改變比較準則會輕鬆得多. 用 friend當未來程式一大, 些許更新 要改的檔案會較多, 看你的情況來做選擇囉! 附上 friend 的作法, 跟靜態成員函式差不多 class Person { friend bool PersonLessThan( Person const &lhs, Person const &rhs ); private: std::string name; }; bool PersonLessThan( Person const &lhs, Person const &rhs ) { return lhs.name < rhs.name; } 設計上的問題還能幫點忙, 至於語法上的問題你還是要多看一下書喔 ! ...Orz -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (03/01 02:14)
joy0520:好詳細 感謝您!!! 03/01 07:54