作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [討論] friend的使用
時間Tue Sep 20 01:42:40 2011
※ 引述《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