[問題] 子類別如何共用父類別成員變數

看板C_and_CPP (C/C++)作者 (Daily Game)時間16年前 (2010/06/22 21:22), 編輯推噓5(5021)
留言26則, 6人參與, 最新討論串1/3 (看更多)
我現在有一個基底類別如下 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

06/22 21:50, , 1F
姑且不論狀態機該不該這樣寫,你需要的工具是 pointer。
06/22 21:50, 1F
*刪除與問題無關的敘述... 請問t大所說的pointer是指將變數宣告為pointer? 這樣要讓pointer指向哪個位置呢? ※ 編輯: newdominic 來自: 118.167.204.43 (06/22 22:21) ※ 編輯: newdominic 來自: 118.167.204.43 (06/22 22:30)

06/22 22:39, , 2F
Effective C++. 確定你的public繼承塑造出is-a關係
06/22 22:39, 2F

06/22 22:42, , 3F
如果那些members與class State沒啥關, 根本就不要寫進去
06/22 22:42, 3F

06/22 22:48, , 4F
在子類別用reference?像是 int &childVar=intVar;
06/22 22:48, 4F
如果在子類別用reference,這樣參考到的會是同一個intVar嗎? 感覺應該是不同instance裡面的intVar?

06/22 22:52, , 5F
請教一下在這邊用 static 有什麼問題嗎?
06/22 22:52, 5F
沒有問題,只是好奇其他解法XD"

06/22 22:53, , 6F
請問t大說的用pointer 有什麼好的寫法嗎???
06/22 22:53, 6F

06/22 22:53, , 7F
或是比較正統的寫法
06/22 22:53, 7F
※ 編輯: newdominic 來自: 118.167.204.43 (06/22 23:18)

06/22 23:16, , 8F
其實就是讓 concrete state 的 data member 指向 base 的
06/22 23:16, 8F

06/22 23:16, , 9F
data member,當然也能用 reference。
06/22 23:16, 9F

06/22 23:17, , 10F
當然更 OO 一點的方法是你先封裝 base 的 data members,
06/22 23:17, 10F

06/22 23:17, , 11F
提供 protected 的 getter/setter 就行了。
06/22 23:17, 11F

06/22 23:18, , 12F
但是更根本的問題就真的說來話長了。
06/22 23:18, 12F

06/22 23:19, , 13F
要分成狀態內部是否真的需要帶 instance variable,
06/22 23:19, 13F

06/22 23:20, , 14F
還有每個 state 是否只有一個實體 (會影響 thread-safety)
06/22 23:20, 14F

06/22 23:20, , 15F
來討論;光這兩大類就有 2 x 2 = 4 種細項要講。
06/22 23:20, 15F

06/22 23:24, , 16F
我比較好奇的是 intVar 和 floatVar 是不是應該屬於
06/22 23:24, 16F

06/22 23:24, , 17F
context class 的成員?如果是的話把它提到 context 去,
06/22 23:24, 17F

06/22 23:24, , 18F
A() 和 B() 都改成接收 Context * 就可以了。
06/22 23:24, 18F

06/22 23:28, , 19F
基本上,不管是你用了 static 還是 singleton,就表示它是
06/22 23:28, 19F

06/22 23:28, , 20F
可共用的 state,state 物件內部就不能有 data member。
06/22 23:28, 20F

06/22 23:28, , 21F
不然就算是 single thread 程式,你造一堆 context 物件
06/22 23:28, 21F

06/22 23:29, , 22F
去轉來轉去,你的資料就亂了。
06/22 23:29, 22F

06/22 23:30, , 23F
所以在你進一步描述那兩個 data member 是幹嘛的之前,
06/22 23:30, 23F

06/22 23:30, , 24F
我也只能這樣大方向的回你。
06/22 23:30, 24F

06/22 23:44, , 25F
光t大說的大方向 我就很難懂了....context class是什麼意思阿
06/22 23:44, 25F

06/23 01:45, , 26F
感謝各位的回覆 我另外發了篇較詳細的 還請不吝賜教
06/23 01:45, 26F
文章代碼(AID): #1C8BaPeM (C_and_CPP)
文章代碼(AID): #1C8BaPeM (C_and_CPP)