我们假设我们有三个班级A
,B
和C
。 B
拥有A
的私有实例,C
拥有B
的实例(即C
- > B
- > { {1}})。 A
需要收到来自C
的{{1}}信号,但由于update()
是私有的,我们可以:
使用A
中的访问者方法允许访问A
的{{1}}信号。例如,
B
中的:
A
或者,我们可以将update()
中的C
connect(B.getA(), SIGNAL(update()), this, SLOT(doUpdate()));
信号转发给A
。例如,
update()
中的:
B
和C
:
B
或者,我完全遗漏了一些其他选择;不确定。
基本上,这两个选项有什么区别?两种方式都没有打破封装,但是有转发信号会引入延迟吗?文档说第二个信号是在收到第一个信号后立即发送的,因此看起来不会有太大差别,但我很好奇是否有一个'右'这样做的方法。
哦,我意识到"隐藏"标题中的内容并不准确,但我无法想到一种更好的方式来表达它而不会过于冗长。
答案 0 :(得分:2)
在同一个线程中发出的信号只是一个调用(除非您明确要求使用队列),因此从性能的角度来看,除非您创建了大量(数百万)信号,否则成本可以忽略不计每秒(在这种情况下,可能使用信号无论如何都是一个坏主意)。如果GUI相关机器需要这样做,那么成本很可能无关紧要,因为在GUI中绘制单个字符的成本要高得多。
关于封装,如果不了解更多有关A
,B
或C
的信息,很难说清楚... C
希望收到有关发生的事情的通知B
隐藏的内容听起来很奇怪......可能B
应该来自A
,或者至少从逻辑的角度重新发布该信号?
答案 1 :(得分:1)
我个人会将A的信号连接到B中的(重复)update
信号。这样你就可以隐藏B的实现,并且可以在以后改变内部机制。它不是一个过于复杂的形式,但C中的connect(B.getA(), SIGNAL(update()), this, SLOT(doStuff()))
版本闻起来有点Law of Demeter。