[問題] inline和.h寫定義

看板C_and_CPP作者 (我愛阿蓉)時間13年前 (2010/09/15 00:42), 編輯推噓2(2040)
留言42則, 6人參與, 最新討論串1/3 (看更多)
請教一個問題... 之前版上看到 "寫在.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)

09/15 00:51, , 1F
雖然看到內文知道你在說什麼 但是個人覺得有誤導嫌疑
09/15 00:51, 1F

09/15 00:52, , 2F
很像在描述函數定義在.h 會被自動inline
09/15 00:52, 2F

09/15 00:52, , 3F
大哉問啦~
09/15 00:52, 3F

09/15 00:53, , 4F
但事實上你是在說 C++ Class member function 的東東
09/15 00:53, 4F

09/15 00:54, , 5F
我發現沒去點網頁就先推文是錯的選擇...
09/15 00:54, 5F

09/15 00:55, , 6F
等待 t 大大的降臨吧
09/15 00:55, 6F

09/15 00:55, , 7F
另外private public 惡搞的話有可能會造成 ABI 不合
09/15 00:55, 7F

09/15 00:56, , 8F
抱歉 我也是想到什麼趕快問 怕我忘記....
09/15 00:56, 8F

09/15 00:56, , 9F
a大意思是 我私自把 private改成public對於lib會造成影響?
09/15 00:56, 9F

09/15 00:57, , 10F
至於ABI是啥我在去找找...會太少
09/15 00:57, 10F

09/15 00:57, , 11F
你'可能'會因為惡搞權限導致 mem layout 不一樣
09/15 00:57, 11F

09/15 00:58, , 12F
導致物件在 lib 跟你程式端在認知上有落差而造成嚴重後果
09/15 00:58, 12F

09/15 00:59, , 13F
為每個member都寫getter/setter本來就是爛的設計, 表
09/15 00:59, 13F

09/15 00:59, , 14F
有說明在講這塊嗎 完全不懂private和public layout差異...
09/15 00:59, 14F

09/15 00:59, , 15F
示你沒有達成「抽象化」的工作, 而只做到封裝而已, 就
09/15 00:59, 15F

09/15 01:00, , 16F
直覺覺得 可以直接改= = l大那什麼是好的設計阿@@?
09/15 01:00, 16F

09/15 01:00, , 17F
像vector一樣, 難道還可以回傳指標給你delete嗎?
09/15 01:00, 17F

09/15 01:08, , 18F
l大如果不用寫get set那有好方法呢? 使用者用的到我就覺得
09/15 01:08, 18F

09/15 01:08, , 19F
該寫get set耶 還有比較好的設計嗎?
09/15 01:08, 19F

09/15 01:22, , 20F
假如我現在有一個Employee類, 裡面只有double salary;
09/15 01:22, 20F

09/15 01:26, , 21F
假如我需要的功能只有把員工調薪而已, 提供
09/15 01:26, 21F

09/15 01:27, , 22F
bool Increment( double ); 比較好? 還是要使用者用
09/15 01:27, 22F

09/15 01:28, , 23F
setSalary( getSalary() + x ); 自己兜出來比較好呢?
09/15 01:28, 23F

09/15 01:29, , 24F
類別設計需要考慮使用者未來會怎麼應用, 你給他最基本
09/15 01:29, 24F

09/15 01:30, , 25F
的東西, 他可能不會用, 也不想知道怎麼用, 你所做的就
09/15 01:30, 25F

09/15 01:30, , 26F
是要提供更高一層的抽象化來方便使用者, 這樣code也比
09/15 01:30, 26F

09/15 01:32, , 27F
較清楚, refactoring 一書中雖有談到Self Encapsulate
09/15 01:32, 27F

09/15 01:33, , 28F
Field 連使用自己的成員時也動一些手腳(像是lazy ini-
09/15 01:33, 28F

09/15 01:34, , 29F
tialization), 不過除非必要, 太簡單的setter/getter
09/15 01:34, 29F

09/15 01:35, , 30F
都提供, 其實還不如權限全部改成public
09/15 01:35, 30F

09/15 05:39, , 31F
沒有要把所有的member都給setter getter吧 :)
09/15 05:39, 31F

09/15 05:39, , 32F
沒有必要
09/15 05:39, 32F

09/15 05:39, , 33F
除非是有必要XD
09/15 05:39, 33F

09/15 05:40, , 34F
太多member代表抽象化沒做好
09/15 05:40, 34F

09/15 18:27, , 35F
請教一下什麼叫做抽象沒做好阿? 改成繼承架構
09/15 18:27, 35F

09/15 18:27, , 36F
data member總數應該還是一樣阿 get set還是一樣多吧?
09/15 18:27, 36F

09/15 18:28, , 37F
只是有些在 老爸有些在兒子類別 想了解什麼叫抽象沒做好
09/15 18:28, 37F

09/15 18:28, , 38F
可以請 顯卡大 舉個例嗎@@
09/15 18:28, 38F

09/15 18:31, , 39F
我覺得樓下L大說的imageViewer說的不錯
09/15 18:31, 39F

09/15 20:31, , 40F
每個屬性都提供setter/getter表示你對這個類別所持有
09/15 20:31, 40F

09/15 20:34, , 41F
態度是「資料叢集」, 但其實物件的「行為」才是你設計
09/15 20:34, 41F

09/15 20:34, , 42F
類別最主要的目的
09/15 20:34, 42F
文章代碼(AID): #1CZwO4ZR (C_and_CPP)
文章代碼(AID): #1CZwO4ZR (C_and_CPP)