作者xxxx9659 (嘎嘎嘎嘎嘎)
看板C_and_CPP
標題[問題] class 裡的 private 的意義不大?
時間Mon Nov 30 04:13:42 2009
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
1F:推 buganini:get()裡面你可以檢查餘額 直接動money的話檢查不就廢了 11/30 04:26
2F:→ james732:原po問的應該是這樣達不到「隱藏實作」的目標吧...? 11/30 04:26
3F:→ buganini:假如你有分定存活存和總額 動到其中一個的時候都要update 11/30 04:27
4F:→ buganini:總額 把update的動作放在save/get裡面 可以確保資料一致 11/30 04:28
5F:→ buganini:要聞其他意義的話 防呆也是一個很有意義的意義 11/30 04:29
6F:推 buganini:抽象化的意義並不在防hack啊 11/30 04:31
7F:→ xxxx9659:真的只是為了防呆嗎?這樣感覺也太呆了... 11/30 04:31
8F:→ buganini:發射核彈的按鈕上的蓋子也是可以掀開啊XD 11/30 04:31
9F:→ buganini:請不要小看防呆 那很重要 11/30 04:32
10F:→ buganini:隱藏實做細節 不就是為了簡化操作介面 方便使用 避免蠢事 11/30 04:34
11F:→ xxxx9659:好吧 為了防止核彈發射 我相信你 11/30 04:35
12F:→ buganini:可以把發射選項轉到意外發射再按launch 11/30 04:35
13F:推 buganini:說到防呆 我舉一個我覺得很經典的例子 11/30 04:37
14F:→ buganini:插座孔一大一小 哪個是接中性線? 有些東西的接地線是作成 11/30 04:39
15F:→ buganini:插頭的形式 請問要做大的還是小的? 11/30 04:39
16F:→ buganini:(雖然據說很多水電工拉反) 11/30 04:39
17F:→ xxxx9659:記得是小的接地 11/30 04:40
18F:推 buganini:其實 大的是接地 接地插頭也是大的 因為大的插不進小洞 11/30 04:42
19F:→ buganini:所以你才不會觸電 11/30 04:42
20F:→ xxxx9659:整個猜錯@@ 11/30 04:43
21F:推 buganini:我小時後被電視護目網電過 我覺得家裡的線一定接反了.. 11/30 04:45
22F:→ buganini:不過後來有重拉過所以現在也不得而知了... 11/30 04:45
23F:推 nowar100:為了封裝 11/30 09:36
24F:→ cholid:那你可以只學C 11/30 09:50
25F:推 holymars:Effective C++ 3/e Item 22: Declare data members 11/30 10:11
26F:→ holymars:private. 看完你就會懂了。 11/30 10:11
27F:推 VictorTom:"使用 class 卻看不到原始碼", 這應該有困難; 另外, 如 11/30 10:16
28F:→ VictorTom:果使用的class是外部的lib, 只有宣告沒有定義直接給你, 11/30 10:17
29F:→ VictorTom:你自己改個public出來, 我想link應該不會過; 只有自己寫 11/30 10:17
30F:→ VictorTom:程式時覺得沒什麼, 和別人一起寫/寫程式給別人引用時 11/30 10:18
31F:→ VictorTom:private是避免人家亂搞的一個重要方法....XD 11/30 10:18
32F:推 holymars:link會過 但是跑起來非常有可能會錯 11/30 10:21
33F:→ holymars:C++ standard裡只有規定每個access section中layout順序 11/30 10:22
34F:→ holymars:要和宣告順序一樣,其他的都是implementation-dependent 11/30 10:22
35F:→ holymars:你把變數從private改成public,很可能改變class的layout 11/30 10:22
36F:→ holymars:link會過,但是跑起來之後外部lib裡本來要access那個 11/30 10:24
37F:→ holymars:private data member的code就爛掉了 11/30 10:24
38F:推 VictorTom:暈, 看來以後C++的東西不要亂說Orz 不過您不提還真的不 11/30 10:25
39F:→ VictorTom:知道private/public會影響class layout, 現在看的driver 11/30 10:25
40F:→ VictorTom:裡大家都是private/public會出現個好幾次的....Orz 11/30 10:25
41F:→ tinlans:.......問題就在於你的同事/同學要有 commit 你的檔案到 11/30 10:35
42F:→ tinlans:版本控制系統上的權限。 11/30 10:36
43F:→ tinlans:不然他改了也只能在他的 PC 上自爽而已。 11/30 10:36
44F:推 bizkit:那幹嘛要const 自己不要改不就好了 11/30 11:10
45F:→ adrianshum:想看不到實作的話,去看一看 Bridge pattern (也是所謂 11/30 12:38
46F:→ adrianshum:Handle-body) 11/30 12:38