[問題] 同function name內容不同的方法

看板C_and_CPP (C/C++)作者 (overhead)時間10年前 (2015/06/05 22:28), 編輯推噓2(2021)
留言23則, 6人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++(C++ mfc) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) none 問題(Question): 我現在需求是讓使用者在一開始,決定他要用TCP連線還是serial連線 TCP和serial不是重點 重點是我希望進去後兩種連線是用完全一樣的class, function name 例如open, close, recv, send 這樣才方便後面架構的整潔 目前我的寫法是這樣 int CMyDoc::mainLoop() { CConnect conn; type = TCP; //使用者設定成TCP conn.open(); while(1) { conn.recv(A,B,C); } } int CConnect::open() { if(type == TCP) m_tcpConn.open(); else(type == SERIAL) m_serialConn.open(); //兩個open分別有不同程式碼 } int CConnect::recv(A,B,C) { if(type == TCP) m_tcpConn.recv(A,B,C); else(type == SERIAL) m_serialConn.recv(A,B,C); } 而CConnect擁有成員 CTcpConnect m_tcpConn; CSerialConnect m_serialConn; 這會造成我每次用recv時,都會多花一次在比對他的類型,實在很傷效能 想請問版上有沒有人能提供對付這種問題的關鍵字或建議呢? 希望是一開始有個註冊步驟,或者直接用index指到正確function之類的(?) 要維持最外層的function不動,裡面用到正確的處理方式 可是又不會跟我目前一樣每次進去都要比對一次 非常感謝各位m(_ _)m -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.140.79 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433514538.A.516.html

06/05 22:30, , 1F
用C++的繼承?
06/05 22:30, 1F

06/05 22:31, , 2F
求樓上詳細開導QQ
06/05 22:31, 2F

06/05 22:51, , 3F
你是要 strategy pattern 嗎?
06/05 22:51, 3F

06/05 22:51, , 4F
你有兩個成員讓我有點困惑
06/05 22:51, 4F

06/05 23:01, , 5F
我的想法是class+virtual,各實作繼承於這個class
06/05 23:01, 5F

06/05 23:17, , 6F
function pointer?
06/05 23:17, 6F

06/06 01:43, , 7F

06/06 01:53, , 8F
m_tcpConn, m_serialConn可能來自三方,那用strategy或
06/06 01:53, 8F

06/06 01:59, , 9F
state pattern,得要抽出base class跟兩個derived class
06/06 01:59, 9F

06/06 02:01, , 10F
在Runtime做dynamic binding,效能上可能不見得比原本好
06/06 02:01, 10F

06/06 02:04, , 11F
應該function pointer應該比較合乎你的需求。
06/06 02:04, 11F

06/06 02:15, , 12F
virtual function 就是 function pointer
06/06 02:15, 12F

06/06 02:15, , 13F
但如果堅持 class name 也要一樣的話就只能這樣了
06/06 02:15, 13F

06/06 02:31, , 14F
意義上不同喔!virtual function是建在v_table在Run time
06/06 02:31, 14F

06/06 02:36, , 15F
如果一樣那OO也就不會有Polymorphism這詞出現了
06/06 02:36, 15F

06/06 02:37, , 16F
硬要註冊版: http://ideone.com/zZtcvk
06/06 02:37, 16F

06/06 06:39, , 17F
我不確定標準是否有規定,但大部份vtable都是用function
06/06 06:39, 17F

06/06 06:39, , 18F
pointer實作的(吧)
06/06 06:39, 18F

06/06 10:49, , 19F
非常感謝各位!! 現在來研究大家分享的方法!
06/06 10:49, 19F

06/06 12:06, , 20F
剛剛查了資料 vtable好像真的常用function pointer 也比
06/06 12:06, 20F

06/06 12:07, , 21F
我想像的還快 就決定都改成多型了!非常感謝各位!
06/06 12:07, 21F

06/06 20:14, , 22F
實做上當然是pointer存,我意思只是不能直接說是一樣的東
06/06 20:14, 22F

06/06 20:14, , 23F
西
06/06 20:14, 23F
文章代碼(AID): #1LSR8gKM (C_and_CPP)
文章代碼(AID): #1LSR8gKM (C_and_CPP)