看板 C_and_CPP 關於我們 聯絡資訊
我現在有一個基底類別如下 class State { protected: int intVar; float floatVar; public: virtual void A() { ... }; virtual void B() { ... }; }; 之後再從State衍生出兩種類別 class StateA 與 class StateB 想請問如果StateA與StateB要共用他們從State繼承來的兩個成員變數 除了宣告為static以外,還有甚麼方法可以達到? 我有想過把他們用另一個class包裝起來然後用singleton實作 又覺得太小題大作 腦筋有點轉不過來 還請高手賜教 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.204.43
tinlans:姑且不論狀態機該不該這樣寫,你需要的工具是 pointer。 06/22 21:50
*刪除與問題無關的敘述... 請問t大所說的pointer是指將變數宣告為pointer? 這樣要讓pointer指向哪個位置呢? ※ 編輯: newdominic 來自: 118.167.204.43 (06/22 22:21) ※ 編輯: newdominic 來自: 118.167.204.43 (06/22 22:30)
goodGG:Effective C++. 確定你的public繼承塑造出is-a關係 06/22 22:39
goodGG:如果那些members與class State沒啥關, 根本就不要寫進去 06/22 22:42
loveflames:在子類別用reference?像是 int &childVar=intVar; 06/22 22:48
如果在子類別用reference,這樣參考到的會是同一個intVar嗎? 感覺應該是不同instance裡面的intVar?
yoco315:請教一下在這邊用 static 有什麼問題嗎? 06/22 22:52
沒有問題,只是好奇其他解法XD"
QQ29:請問t大說的用pointer 有什麼好的寫法嗎??? 06/22 22:53
QQ29:或是比較正統的寫法 06/22 22:53
※ 編輯: newdominic 來自: 118.167.204.43 (06/22 23:18)
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
newdominic:感謝各位的回覆 我另外發了篇較詳細的 還請不吝賜教 06/23 01:45