Re: [討論] friend的使用

看板C_and_CPP作者 (我要加入劍道社!)時間14年前 (2011/09/20 01:42), 編輯推噓4(408)
留言12則, 9人參與, 最新討論串2/2 (看更多)
※ 引述《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

09/20 05:00, , 1F
這個問題也太恐怖 orz
09/20 05:00, 1F

09/20 09:43, , 2F
第一次發現比pointer更可怕的東西.c++是充滿陷阱的語言
09/20 09:43, 2F

09/20 13:59, , 3F
c++ 會請你『儘量別使用』 pointer 吧XD
09/20 13:59, 3F

09/20 17:53, , 4F
在哪本書上看過一句話: 好友帶來的麻煩總是多過於其價值
09/20 17:53, 4F

09/20 19:23, , 5F
C++ 要求盡量避免用 pointers, 可是又無法提供替用方案..
09/20 19:23, 5F

09/20 19:25, , 6F
References 的功能根本不到指標的一半, 難用得要死 -_-
09/20 19:25, 6F

09/20 20:23, , 7F
reference並不是pointer的替代方案 它們的用途差很多
09/20 20:23, 7F

09/20 20:26, , 8F
另外 shared_ptr 應該可以滿足大部份的需求
09/20 20:26, 8F

09/20 22:01, , 9F
先用 weak_ptr 再來考慮 shared_ptr 的語意是否恰當
09/20 22:01, 9F

09/21 10:06, , 10F
那些是boost提供的吧?
09/21 10:06, 10F

09/21 10:21, , 11F
被混淆了,我只是想表達friend class比指標更可怕
09/21 10:21, 11F

09/21 12:20, , 12F
shared_ptr是tr1和0x的標準吧?
09/21 12:20, 12F
文章代碼(AID): #1ETtyK4O (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1ETtyK4O (C_and_CPP)