看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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