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

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/11/30 10:32), 編輯推噓5(501)
留言6則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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)

11/30 10:50, , 1F
#define private public這招真是太屌了....XD
11/30 10:50, 1F

11/30 10:50, , 2F
順便推強大的解釋....<(_ _)>
11/30 10:50, 2F

11/30 10:58, , 3F
推詳細的說明!!
11/30 10:58, 3F

11/30 13:29, , 4F
推防過失殺人 XD
11/30 13:29, 4F

11/30 19:25, , 5F
所以真的是防呆!
11/30 19:25, 5F

12/02 13:03, , 6F
pimpl!!!學起來了!!! 感謝!
12/02 13:03, 6F
文章代碼(AID): #1B4ox8J5 (C_and_CPP)
文章代碼(AID): #1B4ox8J5 (C_and_CPP)