看板 C_and_CPP 關於我們 聯絡資訊
class 裡的 private 的意義不大? class Account{ public: bool save(int val); //存錢 bool get(int val); //領錢 private: int money; //存款 } Account man1; 很明顯我只能用 man1.save() 跟 man1.get() 來改變 man1.money 問題來了 我要使用這個 class 勢必可以看到此 class 的原始碼,當然也可以修改它 只要我把 private 這個標籤拿掉,我就可以輕鬆的使用 man1.money 那 private 的意義在哪? 感覺就像,我可以貼一張符咒在殭屍頭上,使殭屍不能走路 但是殭屍可以把符咒撕起來再走,這樣符咒整個很雞肋... 有什麼方法使用 class 卻看不到原始碼,還是說 private 有什麼其他意義在? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.25.118.131
buganini:get()裡面你可以檢查餘額 直接動money的話檢查不就廢了 11/30 04:26
james732:原po問的應該是這樣達不到「隱藏實作」的目標吧...? 11/30 04:26
buganini:假如你有分定存活存和總額 動到其中一個的時候都要update 11/30 04:27
buganini:總額 把update的動作放在save/get裡面 可以確保資料一致 11/30 04:28
buganini:要聞其他意義的話 防呆也是一個很有意義的意義 11/30 04:29
buganini:抽象化的意義並不在防hack啊 11/30 04:31
xxxx9659:真的只是為了防呆嗎?這樣感覺也太呆了... 11/30 04:31
buganini:發射核彈的按鈕上的蓋子也是可以掀開啊XD 11/30 04:31
buganini:請不要小看防呆 那很重要 11/30 04:32
buganini:隱藏實做細節 不就是為了簡化操作介面 方便使用 避免蠢事 11/30 04:34
xxxx9659:好吧 為了防止核彈發射 我相信你 11/30 04:35
buganini:可以把發射選項轉到意外發射再按launch 11/30 04:35
buganini:說到防呆 我舉一個我覺得很經典的例子 11/30 04:37
buganini:插座孔一大一小 哪個是接中性線? 有些東西的接地線是作成 11/30 04:39
buganini:插頭的形式 請問要做大的還是小的? 11/30 04:39
buganini:(雖然據說很多水電工拉反) 11/30 04:39
xxxx9659:記得是小的接地 11/30 04:40
buganini:其實 大的是接地 接地插頭也是大的 因為大的插不進小洞 11/30 04:42
buganini:所以你才不會觸電 11/30 04:42
xxxx9659:整個猜錯@@ 11/30 04:43
buganini:我小時後被電視護目網電過 我覺得家裡的線一定接反了.. 11/30 04:45
buganini:不過後來有重拉過所以現在也不得而知了... 11/30 04:45
nowar100:為了封裝 11/30 09:36
cholid:那你可以只學C 11/30 09:50
holymars:Effective C++ 3/e Item 22: Declare data members 11/30 10:11
holymars:private. 看完你就會懂了。 11/30 10:11
VictorTom:"使用 class 卻看不到原始碼", 這應該有困難; 另外, 如 11/30 10:16
VictorTom:果使用的class是外部的lib, 只有宣告沒有定義直接給你, 11/30 10:17
VictorTom:你自己改個public出來, 我想link應該不會過; 只有自己寫 11/30 10:17
VictorTom:程式時覺得沒什麼, 和別人一起寫/寫程式給別人引用時 11/30 10:18
VictorTom:private是避免人家亂搞的一個重要方法....XD 11/30 10:18
holymars:link會過 但是跑起來非常有可能會錯 11/30 10:21
holymars:C++ standard裡只有規定每個access section中layout順序 11/30 10:22
holymars:要和宣告順序一樣,其他的都是implementation-dependent 11/30 10:22
holymars:你把變數從private改成public,很可能改變class的layout 11/30 10:22
holymars:link會過,但是跑起來之後外部lib裡本來要access那個 11/30 10:24
holymars:private data member的code就爛掉了 11/30 10:24
VictorTom:暈, 看來以後C++的東西不要亂說Orz 不過您不提還真的不 11/30 10:25
VictorTom:知道private/public會影響class layout, 現在看的driver 11/30 10:25
VictorTom:裡大家都是private/public會出現個好幾次的....Orz 11/30 10:25
tinlans:.......問題就在於你的同事/同學要有 commit 你的檔案到 11/30 10:35
tinlans:版本控制系統上的權限。 11/30 10:36
tinlans:不然他改了也只能在他的 PC 上自爽而已。 11/30 10:36
bizkit:那幹嘛要const 自己不要改不就好了 11/30 11:10
adrianshum:想看不到實作的話,去看一看 Bridge pattern (也是所謂 11/30 12:38
adrianshum:Handle-body) 11/30 12:38