[問題] 用enum還是class好?

看板C_and_CPP (C/C++)作者 (A-bo)時間13年前 (2013/02/03 00:54), 編輯推噓5(5036)
留言41則, 14人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev c++...我知道很多人很不推,但他不用建project 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 是這樣的:小弟我要寫的程式需要很多個參數並且給許多function用到 在還不想把這些function結合成一個class的情況下想要用一個東西把這些參數包起來 因為我不想用Global的變數但是又不想要所有的function都有一堆輸入 一開始我想用個enum包成 enum parameters{ p1; p2; p3;..... }; 這樣我任何一個function就可以是 xxx function(parameter p){...} 讓輸入變得精簡 但是想到說裡面有一些參數可能有相依的關係 如果用class就可以定義member function在更改其中一者的時候順勢改其它參數 因此想請問定義enum的話會比定義class多了什麼優勢?或是直接定義class就好 還是說是否建議我乾脆把這些functions集合成一個class比較好? 還是有其他更好的寫法呢? 小弟在此謝過各位前輩 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.156.102

02/03 00:57, , 1F
enum不是這樣用吧.....
02/03 00:57, 1F

02/03 01:05, , 2F
enum的優勢是自動產生不重複的整數常數
02/03 01:05, 2F

02/03 01:05, , 3F
所以沒用到這樣的特性你就是在找自己和別人的麻煩
02/03 01:05, 3F

02/03 01:06, , 4F
然後拿來包裝多個參數絕對是錯的...
02/03 01:06, 4F

02/03 01:34, , 5F
你在想辦法避免麻煩,但你做的決定都會讓以後更麻煩
02/03 01:34, 5F

02/03 01:53, , 6F
你應該不是要enum 而是要struct
02/03 01:53, 6F

02/03 01:54, , 7F
enum是列舉型態 不會拿來存放變數
02/03 01:54, 7F

02/03 02:03, , 8F
struct 也可以擁有 member functions, 包起來方便一組
02/03 02:03, 8F

02/03 02:05, , 9F
參數用於多個函式呼叫, 但是通常不會這樣包山包海, 假
02/03 02:05, 9F

02/03 02:06, , 10F
如 func1() 需要用到 a、b 那麼就會另外包一個 struct
02/03 02:06, 10F

02/03 02:07, , 11F
專門 for func1(), 嫌給初始值的程式碼很討厭就再多一
02/03 02:07, 11F

02/03 02:09, , 12F
個 helper 取得初始化好的結構物件, 這也可以達到你說
02/03 02:09, 12F

02/03 02:10, , 13F
順勢改值的動作, helper 裡的程式碼變乾淨, 你的讀者
02/03 02:10, 13F

02/03 02:10, , 14F
也不需要因為一個包山包海的參數而不知道如何使用這些
02/03 02:10, 14F

02/03 02:11, , 15F
函式, 另外會包成 class 並且提供 member function 時
02/03 02:11, 15F

02/03 02:12, , 16F
通常是你想要keep住某些'狀態'才會使用的, 一般像數學
02/03 02:12, 16F

02/03 02:12, , 17F
裡的函式則不會因為這樣就隨便包成class, 你在乎的可
02/03 02:12, 17F

02/03 02:13, , 18F
能是你現在寫code的方便性, 但是程式碼一字一句都關係
02/03 02:13, 18F

02/03 02:13, , 19F
著它未來的維護性, 請不要把它當成是一些指令那麼簡單
02/03 02:13, 19F

02/03 02:13, , 20F
不然很可能會吃虧
02/03 02:13, 20F

02/03 02:51, , 21F
有些 C 的程式會用個 struct 把整組變數包起來
02/03 02:51, 21F

02/03 02:52, , 22F
相當於這段程式的 context
02/03 02:52, 22F

02/03 02:52, , 23F
呼叫函式的時候第一個引數就填 context 的位址
02/03 02:52, 23F

02/03 02:52, , 24F
context 相當於 C++ 裡的 class member variable
02/03 02:52, 24F

02/03 02:53, , 25F
而傳位址就相當於 this pointer
02/03 02:53, 25F

02/03 03:36, , 26F
... context 跟 state 是不同的
02/03 03:36, 26F

02/03 03:48, , 27F
樓上二位的討論我想起 FILE 這東西 (struct) ...
02/03 03:48, 27F

02/03 10:54, , 28F
樓上說的就是經典的微軟API常用的XDlll那一堆struct超煩
02/03 10:54, 28F

02/03 14:21, , 29F
enum非左值,請注意
02/03 14:21, 29F

02/03 14:40, , 30F
不過 不用建project的話 vim + g++也可以啊(被打
02/03 14:40, 30F

02/03 17:16, , 31F
(Code::Blocks 也可以不用建專案..)
02/03 17:16, 31F

02/03 20:00, , 32F
不用建專案是優點嗎...
02/03 20:00, 32F

02/03 20:03, , 33F
如果只想寫10行測語法連存檔都不想存的時候是XD
02/03 20:03, 33F

02/03 20:03, , 34F
online compiler還是麻煩了點
02/03 20:03, 34F

02/03 20:05, , 35F
可是就會養出linker error不會處理的同事
02/03 20:05, 35F

02/03 21:34, , 36F
我都是一個project一直用...
02/03 21:34, 36F

02/03 22:14, , 37F
VC有個vsvars32.bat可以在cmd下設定環境變數
02/03 22:14, 37F

02/03 22:15, , 38F
執行後就可以直接用 cl 編譯程式碼,不需要建立project。
02/03 22:15, 38F

02/04 00:40, , 39F
話說我VC都會建一個測試專用的project...也不太麻煩
02/04 00:40, 39F

02/04 13:16, , 40F
當然是啊 你看我都用vim 都不用建專案的 !!!
02/04 13:16, 40F

02/04 13:17, , 41F
如果只是單純要測試語法 不見專案很正常呀XD
02/04 13:17, 41F
文章代碼(AID): #1H3KJ1Mi (C_and_CPP)
文章代碼(AID): #1H3KJ1Mi (C_and_CPP)