Re: [问题] 非兄弟物件之间要怎么沟通?

楼主: whcbs (hc)   2022-07-12 22:48:14
※ 引述《liu2007 (薯)》之铭言:
: 会变成每一层都多一个parent pointer 的 field
: 每一层的建构子都要都要多塞一个parent的pointer,在new 的时候也要把this丢进去
: 然后每一层的slot都只干一件事情,就是emit signal给上层
: 这样一来写了一堆很重复很累赘的程式码只为了传递一个讯号
: 取名也很头痛,通常会取很相近的名字,
: 如果这之中有bug出现,还要定睛去看到底是哪一层传错,很累。
: 似乎只能用上述的方法3 singleton,也就变成必须要include GramPa.h
: 程式多多少少搞得臃肿,如果GramPa.h有改的话还拖累编译的速度
: 我不知道我问的是否清楚(因为我要上班了,有点慌乱在乱打文章)
: 我的程式有很多那种某个小功能按钮按下去之后要叫很外面的UI做动作的地方
: 想知道该怎么做比较好
: 感谢阅读
其实跟阿公、老爸、儿子无关,因为这个问题其实是把继承与接口搞错
当然我不知道你实际上的程式码长怎么样,举例来说
QA <- QB <- QC 这样的类型设计好了
你应该要思考的是 B 有没有必要包含 A,C 有没有必要包含 B
如果你需要的是共通接口,那应该是让 QA QB QC 去虚拟继承一个 interface (pure
abstract class) ,我们就叫 QI 好了
以UI的设计角度来说,我会认为除了 Model 或 View 以外,基于Qt框架以上又延展到
三四层的继承关系是很奇怪的。
再来是 connecting 的问题,根据你的描述我认为你应该是透过 constructor 传递指
标来进行 connecting。如果你按照我上述所讲的 将继承改为接口实作 后,这个问
题的解法也就简单,同样是使用一个认识 QA 的 class,这个 class 可以是 builder
也可以是 factory,甚至可以透过 template 的方式决定你要建构的物件,最简单也
可以是 function,在建立的同时就完成 connecting
例如 (智能指标跟constraint我就懒得打了)
template<typename T, typename... Args>
QI* create(QA& master, Args&&...);
这边写 QA 是因为假定你的QA是整个运转的中枢或桥梁之类的存在......
其实类似的作法还有很多,比方说你原文提到的
“我的程式有很多那种某个小功能按钮按下去之后要叫很外面的UI做动作的地方”
这种其实也能看作是 global event
最后我会建议你去了解一下 Qt 整个 MVC 的架构设计,我看过很多人都把 Model 的
逻辑刻在 UI 上...... 实际上 Ot 其本身提供的工具跟基础类别了解的话能省下很
多时间

Links booklink

Contact Us: admin [ a t ] ucptt.com