我们说SomeClass
有成员Object1
和Object2
,并且Object1
和Object2
之间有联系,如:
connect(Object1, signal1, Object2, slot1)
在Object3
添加了一些重构SomeClass
后,Object2
被移动为Object3
的成员,但仍然需要{{1}之间的连接}和Object1
。
Object2
和Object1
之间的通信现在必须经过Object2
。这意味着需要修改Object3
,添加一对信号/广告位,以实现Object3
和Object1
之间的通信。
这意味着Object2
' s .h和.cpp都会被修改,添加许多行代码来完成以前只在一行中完成的事情。
我懒惰的一面是说这个故事有些奇怪。有没有办法让这种联系更直接?
答案 0 :(得分:5)
您将Object2
封装在Object3
中。从Object3
的用户的角度来看,没有任何变化:仍然只有一行代码来设置连接。 Object3
需要一个额外的插槽,转发到它现在封装的Object2
实例。这里有一个额外行。就是这样。
struct Object1 : QObject {
Q_SIGNAL void signal1();
Q_OBJECT
};
struct Object2 : QObject {
Q_SLOT void slot1() {}
Q_OBJECT
};
class Object3 : QObject {
Q_OBJECT
Object2 m_object2;
public:
// one line to expose object2's slot
Q_SLOT void slot1() { m_object2.slot1(); }
};
class SomeClass {
Object1 m_object1;
Object3 m_object2;
public:
SomeClass() {
// still one line
connect(&m_object1, &Object1::signal1, &m_object3, &Object3::slot1);
}
};