假设我们有三个类,A
、B
和C
。 B
持有A
的私有实例,C
持有B
的实例(即 C
-> B
-> A
)。 C
需要接收来自A
的update()
信号,但由于A
是私有的,我们可以:
在B
中使用访问器方法来允许访问A
的update()
信号。例如
在C
:
connect(B.getA(), SIGNAL(update()), this, SLOT(doUpdate()));
或者,我们可以将A
的update()
信号转发给B
C
。例如
在B
:
connect(A, SIGNAL(update()), this, SIGNAL(update()));
在C
:
connect(B, SIGNAL(update()), this, SLOT(doUpdate()));
或者,我完全缺少的其他一些选择;不确定。
基本上,这两个选项之间有什么区别?这两种方式都不会破坏封装,但是转发信号会引入延迟吗?文档说第二个信号在收到第一个信号后立即发送,所以看起来不会有太大区别,但我很好奇是否有"正确"的方法可以做到这一点。
哦,我意识到标题中的"隐藏"并不准确,但我想不出更好的措辞方式而不会太罗嗦。
在同一线程中发出的信号只是一个调用(除非您明确要求使用队列),因此从性能的角度来看,成本可以忽略不计,除非您每秒创建大量(数百万)个信号(在这种情况下,使用信号可能是一个坏主意)。如果与GUI相关的机器需要这样做,那么成本很可能无关紧要,因为在GUI中绘制单个字符的成本要高得多。
关于封装,如果不了解A
、B
或C
,就很难分辨......事实上,C
想要被告知B
隐藏的内脏中发生的事情听起来很奇怪......也许B
应该从逻辑角度从A
或至少重新发布该信号?
我个人会将 A 的信号连接到 B 中的(重复)update
信号。这样,您就可以对 C 隐藏 B 的实现,并且可以稍后更改内部机制。这不是一个过于复杂的形式,但 C 语言的connect(B.getA(), SIGNAL(update()), this, SLOT(doStuff()))
版本闻起来有点得墨忒耳定律。