看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《tyc5116 (累人啊....)》之銘言: : friend class在實務上有什麼例子是有絕對優勢嗎? 我想到的絕對優勢 那大概就是可以寫 quick and dirty code 就是老闆明天就要叫你生出東西 所以你沒時間為 class 添加適當介面的時候 說到 friend 我就想到前陣子的慘痛經驗 那時我正在為一個音樂遊戲寫遠端儲存玩家紀錄的功能 簡單地講,玩家在玩過遊戲後會有很多筆記錄 每筆記錄都是用一個 class 去存 簡化後大概像這樣 class Record { private: unsigned int _maxScore; public: Record() : _maxScore(0) {} void setScore(unsigned int score) { if(score > _maxScore) _maxScore = score; } void save() { // write score to some device... } }; 這個 class 做的事就是把最高的分數記錄下來 而 save() 這個函式做的就是把分數存到某個記憶裝置上 以上是原本就有的功能,而我當時的工作是在 save() 添加一項網路操作 把分數存到我們的伺服器上,這樣就可以進行網路排名 然而因為一些外部限制,我們必須儘量減少網路傳輸 因此我就改成下列的做法: class Record { private: unsigned int _maxScore; bool _dirty; public: Record() : _dirty(false), _maxScore(0) {} void setScore(unsigned int score) { if(score > _maxScore){ _maxScore = score; _dirty = true; } } void save() { if(_dirty){ // save score to our server... } // write score to some device... } }; 減少傳輸量最簡單的方法就是用 dirty bit 只有變動過的資料才需要存到 server 上 但不幸的是上面的 code 在實際運作時仍然造成了嚴重的錯誤 因為 Record 的 friend class 不知道它多了一個 dirty bit 然後就快快樂樂地跳過 setScore 而直接跑去寫 _maxScore 自此之後我打死不再用 friend (好啦偶爾還是不得不用 就跟goto的頻率差不多) friend 有一股邪惡的魔力 那就是當你看到某個 class 設定了許多 friend class 之後 就會知道它的介面絕對很爛 但要修改也力不從心 因為那堆 friend class 也要跟著改才行 於是這個 class 就會被放置play 被大家不停地添加 friend class 結論:請不要和 friend 當好朋友 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.127.111
james732:這個問題也太恐怖 orz 09/20 05:00
angleevil:第一次發現比pointer更可怕的東西.c++是充滿陷阱的語言 09/20 09:43
xatier:c++ 會請你『儘量別使用』 pointer 吧XD 09/20 13:59
Kerlifw:在哪本書上看過一句話: 好友帶來的麻煩總是多過於其價值 09/20 17:53
uranusjr:C++ 要求盡量避免用 pointers, 可是又無法提供替用方案.. 09/20 19:23
uranusjr:References 的功能根本不到指標的一半, 難用得要死 -_- 09/20 19:25
littleshan:reference並不是pointer的替代方案 它們的用途差很多 09/20 20:23
littleshan:另外 shared_ptr 應該可以滿足大部份的需求 09/20 20:26
loveme00835:先用 weak_ptr 再來考慮 shared_ptr 的語意是否恰當 09/20 22:01
shadow0326:那些是boost提供的吧? 09/21 10:06
angleevil:被混淆了,我只是想表達friend class比指標更可怕 09/21 10:21
hilorrk:shared_ptr是tr1和0x的標準吧? 09/21 12:20