[問題] 非兄弟物件之間要怎麼溝通?

作者: liu2007 (è–¯)   2022-07-12 16:45:37
我的開發平台是 win7
工具是QT Creator
版本是Qt Core 5.15.2
有個問題困擾我很久,不知道該怎麼寫才好
故來請教比較好的寫法是什麼
在開始問問題之前想要說明的是
下面我會用到阿公、父親、兒子的說法其實不是很準確
只是單純我自己用來說明什麼class 包含 什麼 class的用詞
如果造成混淆請見諒。
例如 class Father裡面有一個class Child 的 property
而 class GramPa 裡面有一個 class Father 的 property
以下自行理解的解決方法是素人方法
太菜還請見諒
如果兩個Child物件要溝通沒有問題
把一方的signal和slot給connect()起來就好
這也是最基礎的寫法。
只要知道兩個Child的pointer就好。
如果是祖孫溝通
對於 Father 來說
就必須要有 GramPa 和 Child的pointer才能進行connect
對 Father 來說,Child 是自己製造或是本來自己的 property所以沒問題
GramPa 的話
1.除非本來就有寫一個 getParent()來認親,要不然
2.只能一開始在生成 Father的時候在建構子裡面塞 GramPa 的pointer
3.或者是如果 GramPa 偉大到整個program只會有一個 GramPa 的話
也可以用 singleton來取得 GramPa 的pointer
但如果祖孫的距離不只一層呢?
如果是上述的方法1或方法2
會變成每一層都多一個parent pointer 的 field
每一層的建構子都要都要多塞一個parent的pointer,在new 的時候也要把this丟進去
然後每一層的slot都只幹一件事情,就是emit signal給上層
這樣一來寫了一堆很重複很累贅的程式碼只為了傳遞一個訊號
取名也很頭痛,通常會取很相近的名字,
如果這之中有bug出現,還要定睛去看到底是哪一層傳錯,很累。
似乎只能用上述的方法3 singleton,也就變成必須要include GramPa.h
程式多多少少搞得臃腫,如果GramPa.h有改的話還拖累編譯的速度
我不知道我問的是否清楚(因為我要上班了,有點慌亂在亂打文章)
我的程式有很多那種某個小功能按鈕按下去之後要叫很外面的UI做動作的地方
想知道該怎麼做比較好
感謝閱讀
作者: shibin (喜餅)   2022-07-12 18:57:00
為何GrandPa需要和Child溝通,讓他們跟某Global溝通如何?
作者: LPH66 (-6.2598534e+18f)   2022-07-12 18:59:00
你還有 UI 層, 那樓上的「某Global」可以理解為視窗訊息
作者: s4300026 (s4300026)   2022-07-12 20:31:00
可以用MVC嗎? 祖父是V,孫子是M,父親是C。 父親裡面有祖父和孫子,請老爸當傳聲筒。然後沒有繼承關係,可以不要用祖父,父親,兒子嗎?用event丟出來,叫要做事的人hook。
作者: wulouise (在線上!=在電腦前)   2022-07-12 21:57:00
裡面???如果是composite就自己各自掛signal不是很正常嗎如果是繼承,通常用的人都是用Base/Abstract那層吧

Links booklink

Contact Us: admin [ a t ] ucptt.com