Re: [問題] class 裡的 private 的意義不大?
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間16年前 (2009/11/30 10:32)推噓5(5推 0噓 1→)留言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
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
11/30 13:29, 4F
推
11/30 19:25, , 5F
11/30 19:25, 5F
推
12/02 13:03, , 6F
12/02 13:03, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章