[問題] 如何減少程式重複寫的次數?

看板C_and_CPP (C/C++)作者 (1+1≠2)時間14年前 (2012/04/24 21:18), 編輯推噓4(4038)
留言42則, 7人參與, 最新討論串1/1
大家晚安,目前手邊有個程式需要透過Driver來和Host通訊(有點類似一問一答的架構) 但是,目前遇到的問題是,一個PC需要與多個Host連結(ex.Host1~Host3) 假設Driver名稱為Happy,因為我要連結三個Host,因此我必須要new 3個Driver 物件 那麼我該如何著手呢? 我目前做法是,在.h先宣告3個Driver指標物件 Happy* cv_veryhappy1; Happy* cv_veryhappy2; Happy* cv_veryhappy3; 在程式開始時,需要將Driver open,並Attach對應的函數 cv_veryhappy1 = new Happy(); cv_vbryhappy1->OnSent.Attach<CMainDlg>(this, &CMainDlg::OnSent1); cv_vbryhappy1->OnReceive.Attach<CMainDlg>(this, &CMainDlg::OnReceiveSent1); cv_vbryhappy1->OnConnect.Attach<CMainDlg>(this, &CMainDlg::OnConnect1); cv_veryhappy2 = new Happy(); cv_vbryhappy2->OnSent.Attach<CMainDlg>(this, &CMainDlg::OnSent2); cv_vbryhappy2->OnReceive.Attach<CMainDlg>(this, &CMainDlg::OnReceiveSent2); cv_vbryhappy2->OnConnect.Attach<CMainDlg>(this, &CMainDlg::OnConnect2); 如果連接3個就必須new三個物件,而且還要Attach三個函數 如果連結10個...每個物件4行,那不就要寫40行.... 想請問一下,有沒有辦法可以避免重複寫的方式呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.171.28.123

04/24 21:29, , 1F
物件陣列或者是Link?
04/24 21:29, 1F

04/24 21:41, , 2F
有辦法在處理函數被觸發的當下知道是由哪個Happy觸發的嗎
04/24 21:41, 2F

04/24 21:46, , 3F
回stupid大,不太懂你的意思,你的意思是要宣告成
04/24 21:46, 3F

04/24 21:46, , 4F
map ?
04/24 21:46, 4F

04/24 21:46, , 5F
Happy* cv_veryhappy[];這樣嗎?
04/24 21:46, 5F

04/24 21:47, , 6F
Factory Method Design Pattern 能用嗎?
04/24 21:47, 6F

04/24 21:48, , 7F
回s37大,沒辦法,一個函數對應到一個Happy driver..
04/24 21:48, 7F

04/24 21:48, , 8F
define
04/24 21:48, 8F

04/24 21:49, , 9F
macro
04/24 21:49, 9F

04/24 21:52, , 10F
你這些不能寫一個ctor嗎?我看你的好像不同的
04/24 21:52, 10F

04/24 21:54, , 11F
假如改變對應函數寫法的話可以更精簡
04/24 21:54, 11F

04/24 21:54, , 12F
程式碼都只有CMainDlg不同,能夠當作傳進ctor的參數
04/24 21:54, 12F

04/24 21:55, , 13F
#define Happy_init(a) do{...}while(0)
04/24 21:55, 13F

04/24 21:56, , 14F
更正 Happy_init(a,b)
04/24 21:56, 14F

04/24 21:57, , 15F
這在編譯時期就知道數量才能用了0.0
04/24 21:57, 15F

04/24 22:03, , 16F
很好奇為什麼&CMainDlg::OnSent1之類的不寫在class內?
04/24 22:03, 16F

04/24 22:03, , 17F
#define HAPPYATTACH(_HAPPY,_EVENT,_FUNC) \
04/24 22:03, 17F

04/24 22:03, , 18F
不太像是物件導向了,那直接寫C就好了
04/24 22:03, 18F

04/24 22:04, , 19F
_HAPPY->On##_EVENT.Attach<CMainDlg> \
04/24 22:04, 19F

04/24 22:04, , 20F
(this, &CMainDlg::_FUNC)
04/24 22:04, 20F

04/24 22:04, , 21F
EX: HAPPYATTACH(cv_veryhappy1,Sent,OnSent1);
04/24 22:04, 21F

04/24 22:06, , 22F
OnSent,OnReceive等不能在new Happy()時初始化嗎?
04/24 22:06, 22F

04/24 22:11, , 23F
回樓上,可以。不過有時可能在runtime須要detach或attach
04/24 22:11, 23F

04/24 22:35, , 24F
來個移花接木吧~ http://ideone.com/3m3Bf
04/24 22:35, 24F

04/24 23:05, , 25F
阿.. 容我修正一下...
04/24 23:05, 25F

04/24 23:16, , 26F
呼~ 先這樣就好,單純有個方向 http://ideone.com/qHeyJ
04/24 23:16, 26F

04/24 23:24, , 27F
這樣應該就有辦法在觸發事件的當下,知道是哪個Happy了
04/24 23:24, 27F

04/25 00:32, , 28F

04/25 00:35, , 29F
收到Event時不知道是哪個Happy,只知道是哪個hander
04/25 00:35, 29F

04/25 00:35, , 30F
的寫法。
04/25 00:35, 30F

04/25 23:04, , 31F
請問一下,如果使用MultiThread的方式會不會比較好寫?
04/25 23:04, 31F

04/25 23:06, , 32F
因為剛接觸C++兩個月,如果用到多執行緒,怕會很難下手
04/25 23:06, 32F

04/25 23:07, , 33F
因為連樓上各位大大的用法有些都看不太懂了@@
04/25 23:07, 33F

04/26 00:08, , 34F
如果要用多執行緒的話,要注意執行緒之間資源共用的問題,
04/26 00:08, 34F

04/26 00:09, , 35F
還有呼叫的function是不是Multithread-Safe。
04/26 00:09, 35F

04/26 00:15, , 36F
如果沒有需要在背景執行的工作,用single thread比較好寫
04/26 00:15, 36F

04/26 00:20, , 37F
我的想法是,當PC傳送或接收訊息給Host1的同時,
04/26 00:20, 37F

04/26 00:21, , 38F
有可能PC會接收到Host2的訊息,更有可能要對接收到的訊
04/26 00:21, 38F

04/26 00:21, , 39F
息做處理(ex.在螢幕上顯示..等),那這樣是否需要用到
04/26 00:21, 39F

04/26 00:22, , 40F
Multithread呢?
04/26 00:22, 40F

04/26 00:29, , 41F
可能會有三條thread,分別接收、處理跟發送。
04/26 00:29, 41F

04/26 00:31, , 42F
兩個訊息佇列,一個放接收到的訊息,另一個則放要送出的。
04/26 00:31, 42F
文章代碼(AID): #1FbgWOdF (C_and_CPP)
文章代碼(AID): #1FbgWOdF (C_and_CPP)