看板 C_and_CPP 關於我們 聯絡資訊
tinlans:其實就是讓 concrete state 的 data member 指向 base 的 06/22 23:16
tinlans:data member,當然也能用 reference。 06/22 23:16
tinlans:當然更 OO 一點的方法是你先封裝 base 的 data members, 06/22 23:17
tinlans:提供 protected 的 getter/setter 就行了。 06/22 23:17
tinlans:但是更根本的問題就真的說來話長了。 06/22 23:18
tinlans:要分成狀態內部是否真的需要帶 instance variable, 06/22 23:19
tinlans:還有每個 state 是否只有一個實體 (會影響 thread-safety) 06/22 23:20
tinlans:來討論;光這兩大類就有 2 x 2 = 4 種細項要講。 06/22 23:20
tinlans:我比較好奇的是 intVar 和 floatVar 是不是應該屬於 06/22 23:24
tinlans:context class 的成員?如果是的話把它提到 context 去, 06/22 23:24
tinlans:A() 和 B() 都改成接收 Context * 就可以了。 06/22 23:24
tinlans:基本上,不管是你用了 static 還是 singleton,就表示它是 06/22 23:28
tinlans:可共用的 state,state 物件內部就不能有 data member。 06/22 23:28
tinlans:不然就算是 single thread 程式,你造一堆 context 物件 06/22 23:28
tinlans:去轉來轉去,你的資料就亂了。06/22 23:29
tinlans:所以在你進一步描述那兩個 data member 是幹嘛的之前,06/22 23:30
tinlans:我也只能這樣大方向的回你。06/22 23:30
QQ29:光t大說的大方向 我就很難懂了....context class是什麼意思阿06/22 23:44
感謝t大的回覆 但我也不是很瞭解t大的意思||| 抱歉,我似乎把問題簡化過頭了 我目前在做一個牌類遊戲 遊戲的主體是一個牌桌類別 (class Table) 主要運作的函式為 Update() 與 Render() 遊戲的過程分成七種狀態 最初的寫法是用 switch 判斷狀態,再去呼叫對應的函式 但函式一多以後 Table 類別就變得難以整理 所以想嘗試把每個狀態寫成一個類別 這樣每次進入 Table::Update() 和 Table::Render() 時 就呼叫目前狀態的 Update() 與 Render() 於是在將狀態獨立成單一類別的時候 我把該狀態原先在 Table 裡面要操作的 data members 移到狀態類別裡 但在這七個狀態中,又有有 3 、 2 、 2 三組子狀態的 Render() 是做一樣的事情 所以我就把重複的部分再向上提,形成如下的繼承樹 (L1) (L2) (L3) ┌StateA1 ┌StateA┼StateA2 │ └StateA3 │ │ ┌StateB1 State┼StateB┴StateB2 │ │ ┌StateC1 └StateC┴StateC2 Update() 時使用 L3 類別提供的定義 Render() 時使用 L2 類別提供的定義 這樣在 L2 的類別成員用 static 宣告可行 但滿滿的 static 變數讓我有點怕(心理作用?) 所以想知道是否有除此之外的解法 ===== 另外,t大在推文中提到的 context class ,不曉得是不是指文中的 Table 類別? 我有想過在 L1 的 State 類別宣告一個 Table * 在 Table 建構 L3 的狀態物件時,把 this 做為建構參數傳給它 這樣全部的狀態類別就不需要擁有 data members 但在用 Table * 操作的時候會呼叫大量的 setter/getter,讓我難以取捨 這部分不知道我有沒有會錯意? 小弟入門 OO 的時間很短 不曉得哪種寫法從 OO 的角度來看是比較好的,或是有其他更好的方法? 在此先謝謝所有回文的前輩! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.204.43 ※ 編輯: newdominic 來自: 118.167.204.43 (06/23 01:43) ※ 編輯: newdominic 來自: 118.167.204.43 (06/23 01:45)
goodGG:這樣說的話,原先在 Table 裡面要操作的members,本來就該 06/23 08:05
goodGG:放在Table 06/23 08:05
goodGG:這樣語意才會集中在Table, 自然就是美 06/23 08:06
holymars:你可以不要自己寫輪子 boost有statechart可以用~ 06/23 13:24
holymars:順帶一提,boost的implement比較接近你說的第二種方法 06/23 13:27
holymars:連結的版本貼錯了XDy 06/23 13:28