[問題] class 裡的 private 的意義不大?

看板C_and_CPP作者 (嘎嘎嘎嘎嘎)時間15年前 (2009/11/29 20:13), 編輯推噓11(11035)
留言46則, 10人參與, 最新討論串1/2 (看更多)
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

11/30 04:26, , 1F
get()裡面你可以檢查餘額 直接動money的話檢查不就廢了
11/30 04:26, 1F

11/30 04:26, , 2F
原po問的應該是這樣達不到「隱藏實作」的目標吧...?
11/30 04:26, 2F

11/30 04:27, , 3F
假如你有分定存活存和總額 動到其中一個的時候都要update
11/30 04:27, 3F

11/30 04:28, , 4F
總額 把update的動作放在save/get裡面 可以確保資料一致
11/30 04:28, 4F

11/30 04:29, , 5F
要聞其他意義的話 防呆也是一個很有意義的意義
11/30 04:29, 5F

11/30 04:31, , 6F
抽象化的意義並不在防hack啊
11/30 04:31, 6F

11/30 04:31, , 7F
真的只是為了防呆嗎?這樣感覺也太呆了...
11/30 04:31, 7F

11/30 04:31, , 8F
發射核彈的按鈕上的蓋子也是可以掀開啊XD
11/30 04:31, 8F

11/30 04:32, , 9F
請不要小看防呆 那很重要
11/30 04:32, 9F

11/30 04:34, , 10F
隱藏實做細節 不就是為了簡化操作介面 方便使用 避免蠢事
11/30 04:34, 10F

11/30 04:35, , 11F
好吧 為了防止核彈發射 我相信你
11/30 04:35, 11F

11/30 04:35, , 12F
可以把發射選項轉到意外發射再按launch
11/30 04:35, 12F

11/30 04:37, , 13F
說到防呆 我舉一個我覺得很經典的例子
11/30 04:37, 13F

11/30 04:39, , 14F
插座孔一大一小 哪個是接中性線? 有些東西的接地線是作成
11/30 04:39, 14F

11/30 04:39, , 15F
插頭的形式 請問要做大的還是小的?
11/30 04:39, 15F

11/30 04:39, , 16F
(雖然據說很多水電工拉反)
11/30 04:39, 16F

11/30 04:40, , 17F
記得是小的接地
11/30 04:40, 17F

11/30 04:42, , 18F
其實 大的是接地 接地插頭也是大的 因為大的插不進小洞
11/30 04:42, 18F

11/30 04:42, , 19F
所以你才不會觸電
11/30 04:42, 19F

11/30 04:43, , 20F
整個猜錯@@
11/30 04:43, 20F

11/30 04:45, , 21F
我小時後被電視護目網電過 我覺得家裡的線一定接反了..
11/30 04:45, 21F

11/30 04:45, , 22F
不過後來有重拉過所以現在也不得而知了...
11/30 04:45, 22F

11/30 09:36, , 23F
為了封裝
11/30 09:36, 23F

11/30 09:50, , 24F
那你可以只學C
11/30 09:50, 24F

11/30 10:11, , 25F
Effective C++ 3/e Item 22: Declare data members
11/30 10:11, 25F

11/30 10:11, , 26F
private. 看完你就會懂了。
11/30 10:11, 26F

11/30 10:16, , 27F
"使用 class 卻看不到原始碼", 這應該有困難; 另外, 如
11/30 10:16, 27F

11/30 10:17, , 28F
果使用的class是外部的lib, 只有宣告沒有定義直接給你,
11/30 10:17, 28F

11/30 10:17, , 29F
你自己改個public出來, 我想link應該不會過; 只有自己寫
11/30 10:17, 29F

11/30 10:18, , 30F
程式時覺得沒什麼, 和別人一起寫/寫程式給別人引用時
11/30 10:18, 30F

11/30 10:18, , 31F
private是避免人家亂搞的一個重要方法....XD
11/30 10:18, 31F

11/30 10:21, , 32F
link會過 但是跑起來非常有可能會錯
11/30 10:21, 32F

11/30 10:22, , 33F
C++ standard裡只有規定每個access section中layout順序
11/30 10:22, 33F

11/30 10:22, , 34F
要和宣告順序一樣,其他的都是implementation-dependent
11/30 10:22, 34F

11/30 10:22, , 35F
你把變數從private改成public,很可能改變class的layout
11/30 10:22, 35F

11/30 10:24, , 36F
link會過,但是跑起來之後外部lib裡本來要access那個
11/30 10:24, 36F

11/30 10:24, , 37F
private data member的code就爛掉了
11/30 10:24, 37F

11/30 10:25, , 38F
暈, 看來以後C++的東西不要亂說Orz 不過您不提還真的不
11/30 10:25, 38F

11/30 10:25, , 39F
知道private/public會影響class layout, 現在看的driver
11/30 10:25, 39F

11/30 10:25, , 40F
裡大家都是private/public會出現個好幾次的....Orz
11/30 10:25, 40F

11/30 10:35, , 41F
.......問題就在於你的同事/同學要有 commit 你的檔案到
11/30 10:35, 41F

11/30 10:36, , 42F
版本控制系統上的權限。
11/30 10:36, 42F

11/30 10:36, , 43F
不然他改了也只能在他的 PC 上自爽而已。
11/30 10:36, 43F

11/30 11:10, , 44F
那幹嘛要const 自己不要改不就好了
11/30 11:10, 44F

11/30 12:38, , 45F
想看不到實作的話,去看一看 Bridge pattern (也是所謂
11/30 12:38, 45F

11/30 12:38, , 46F
Handle-body)
11/30 12:38, 46F
文章代碼(AID): #1B4jNvhx (C_and_CPP)
文章代碼(AID): #1B4jNvhx (C_and_CPP)