作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] class 裡的 private 的意義不大?
時間Mon Nov 30 10:32:37 2009
※ 引述《xxxx9659 (嘎嘎嘎嘎嘎)》之銘言:
: 很明顯我只能用 man1.save() 跟 man1.get() 來改變 man1.money
: 問題來了
: 我要使用這個 class 勢必可以看到此 class 的原始碼,當然也可以修改它
: 只要我把 private 這個標籤拿掉,我就可以輕鬆的使用 man1.money
: 那 private 的意義在哪?
: 感覺就像,我可以貼一張符咒在殭屍頭上,使殭屍不能走路
: 但是殭屍可以把符咒撕起來再走,這樣符咒整個很雞肋...
: 有什麼方法使用 class 卻看不到原始碼,還是說 private 有什麼其他意義在?
事實上要存取 private member 並不需要改到原始碼啦
你只要在 #include 之前加一行 #define private public 就行了
gcc 還有一個 -fno-access-control 的選項
可以把所有的 private 視為 public
這樣說好了
private 的目的是防止 programmer 過失殺人
而不是防止蓄意謀殺
它只能在你誤用 private member 的時候發出柔性勸導
你要覇王硬上弓它也是拿你沒輒
不過
「有什麼方法使用 class 卻看不到原始碼」
這件事倒是有方法,叫作 pimpl
它的原理是使用另一個 class 來存 class 的 private member
像這樣:
class AccountImpl;
class Account {
public:
bool save(int val);
bool get(int val);
private:
AccountImpl* pimpl;
};
而 AccountImpl 的定義則和 Account 的 member function 定義一起寫在 .cpp 中
這麼一來 header 內就看不到 Account 的內容到底有哪些
只看得到一個不知指向何物的 pointer
除了可以隱藏實作細節
還有節省編譯時間的好處
因為你隨時可以在 AccountImpl 內增加 private member 而不會動到 header
因此使用 Account 的程式碼就省下了重新編譯的時間
更多關於 pimpl 的細節可以參考 Exceptional C++ 這本書
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.108
※ 編輯: littleshan 來自: 140.112.29.108 (11/30 10:33)
推 VictorTom:#define private public這招真是太屌了....XD 11/30 10:50
→ VictorTom:順便推強大的解釋....<(_ _)> 11/30 10:50
推 james732:推詳細的說明!! 11/30 10:58
推 cole945:推防過失殺人 XD 11/30 13:29
推 xxxx9659:所以真的是防呆! 11/30 19:25
推 devilarise:pimpl!!!學起來了!!! 感謝! 12/02 13:03