看板 C_and_CPP 關於我們 聯絡資訊
請教一個問題... 之前版上看到 "寫在.h 定義一定是inline"... 但是我爬文後也找不到相關能佐證的文章... 請問這正確嗎?? 如果自己寫inline這修飾字 也只是"建議" inline 如果定義寫在.h "一定"是inline嗎? 假如我class一坨private data..... 大家都會針對每個private data 寫一份get and set function 所以說有x個private data 就該有 2*x個function? 感覺這樣好累 但是不是好的設計一定要這樣寫?? 至於這種小function 都寫inline修飾 或直接寫在.h的話 不就違反 .h不要寫定義的精神嗎??? 如果"定義寫在.h一定inline" 成立 我把定義寫在.h + lib 的話 給對方header file他不就看的出來我一些定義 雖說這些function都是簡單get set... 我該如何在.h不要寫定義 和 inline做取捨呢? ps. 看教學都是寫 宣告 和 定義 都要寫上inline在前面 如果一邊不寫會怎麼取捨呢? http://www.greenend.org.uk/rjk/2003/03/inline.html 這網頁有提到static inline 但光看他描述實在不懂 且為啥他沒寫inline這字眼呢? 我在想 之前在學校都有講概念說 class封裝 可以達到資料 隱藏阿之類的 我現在突然無法理解他的涵義 我給他.h 他把我private:這字眼全刪掉 改成public: 那不就可以任憑他亂搞嘛? 我那些get set形同虛設 如果是 針對 code實作不想被別人看到要隱藏 編成lib.... 那也不用針對class來講這觀念..... 但就算編程lib .h一坨private他還是可以直接改成public 在自己來亂搞 這觀念在這邊請教一下...... 以上 請教各位 thx~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.70.221 ※ 編輯: QQ29 來自: 123.192.70.221 (09/15 00:44)
akasan:雖然看到內文知道你在說什麼 但是個人覺得有誤導嫌疑 09/15 00:51
akasan:很像在描述函數定義在.h 會被自動inline 09/15 00:52
yoco315:大哉問啦~ 09/15 00:52
akasan:但事實上你是在說 C++ Class member function 的東東 09/15 00:53
akasan:我發現沒去點網頁就先推文是錯的選擇... 09/15 00:54
akasan:等待 t 大大的降臨吧 09/15 00:55
akasan:另外private public 惡搞的話有可能會造成 ABI 不合 09/15 00:55
QQ29:抱歉 我也是想到什麼趕快問 怕我忘記.... 09/15 00:56
QQ29:a大意思是 我私自把 private改成public對於lib會造成影響? 09/15 00:56
QQ29:至於ABI是啥我在去找找...會太少 09/15 00:57
akasan:你'可能'會因為惡搞權限導致 mem layout 不一樣 09/15 00:57
akasan:導致物件在 lib 跟你程式端在認知上有落差而造成嚴重後果 09/15 00:58
loveme00835:為每個member都寫getter/setter本來就是爛的設計, 表 09/15 00:59
QQ29:有說明在講這塊嗎 完全不懂private和public layout差異... 09/15 00:59
loveme00835:示你沒有達成「抽象化」的工作, 而只做到封裝而已, 就 09/15 00:59
QQ29:直覺覺得 可以直接改= = l大那什麼是好的設計阿@@? 09/15 01:00
loveme00835:像vector一樣, 難道還可以回傳指標給你delete嗎? 09/15 01:00
QQ29:l大如果不用寫get set那有好方法呢? 使用者用的到我就覺得 09/15 01:08
QQ29:該寫get set耶 還有比較好的設計嗎? 09/15 01:08
loveme00835:假如我現在有一個Employee類, 裡面只有double salary; 09/15 01:22
loveme00835:假如我需要的功能只有把員工調薪而已, 提供 09/15 01:26
loveme00835:bool Increment( double ); 比較好? 還是要使用者用 09/15 01:27
loveme00835:setSalary( getSalary() + x ); 自己兜出來比較好呢? 09/15 01:28
loveme00835:類別設計需要考慮使用者未來會怎麼應用, 你給他最基本 09/15 01:29
loveme00835:的東西, 他可能不會用, 也不想知道怎麼用, 你所做的就 09/15 01:30
loveme00835:是要提供更高一層的抽象化來方便使用者, 這樣code也比 09/15 01:30
loveme00835:較清楚, refactoring 一書中雖有談到Self Encapsulate 09/15 01:32
loveme00835:Field 連使用自己的成員時也動一些手腳(像是lazy ini- 09/15 01:33
loveme00835:tialization), 不過除非必要, 太簡單的setter/getter 09/15 01:34
loveme00835:都提供, 其實還不如權限全部改成public 09/15 01:35
nvidia:沒有要把所有的member都給setter getter吧 :) 09/15 05:39
nvidia:沒有必要 09/15 05:39
nvidia:除非是有必要XD 09/15 05:39
nvidia:太多member代表抽象化沒做好 09/15 05:40
QQ29:請教一下什麼叫做抽象沒做好阿? 改成繼承架構 09/15 18:27
QQ29:data member總數應該還是一樣阿 get set還是一樣多吧? 09/15 18:27
QQ29:只是有些在 老爸有些在兒子類別 想了解什麼叫抽象沒做好 09/15 18:28
QQ29:可以請 顯卡大 舉個例嗎@@ 09/15 18:28
alongalone:我覺得樓下L大說的imageViewer說的不錯 09/15 18:31
loveme00835:每個屬性都提供setter/getter表示你對這個類別所持有 09/15 20:31
loveme00835:態度是「資料叢集」, 但其實物件的「行為」才是你設計 09/15 20:34
loveme00835:類別最主要的目的 09/15 20:34