Qt基类函数定义



我正在一个使用gcc 4.8.5的Qt5项目中构建一个模板库,目的是发送和接收不共享继承层次结构的类型。我提出的一个可能的解决方案是,基类可以简单地定义信号和槽,派生类可以提供实现,这是有效的。现在,从编译时优化和运行时性能的角度来看,如果基类中有数百个这样的方法,会发生什么?

另一个我没能找到的有效问题似乎是,当两个派生类继承同一个对象时,在编译过程中会发生什么。举下面的例子:

class A{}
class B : A{}
class C : A{}

这种结构有编译时的好处吗?此外,除非Qt定义了一个信号或时隙,否则它不会为类创建moc,因此具有也是如此

class A {
void slot_1();
//...
void slot_100();
}

使编译陷入停顿,这是否有任何运行时开销?我知道Qt槽下面只是一个函数,所以在内存中只创建了一个函数。此外,我知道派生类必须链接moc_a.o文件,但我不太确定链接器能够优化到什么程度。

注意:我知道这违反了SRP和OCP,但上面列出了我最大的担忧和障碍。我愿意研究替代示例和解决方案,只要它们不是不必要的复杂并且对编译时间友好。ISP也在门外,我只是不做那么多的多重继承。

这是一个XY问题:您正在询问解决方案,但您试图解决的实际问题是什么?这些类代表什么?你所说的"发送和接收类型"是什么意思?至于不共享继承层次结构,有一些简单的方法可以解决:一个通用接口可以由一个通用实现的方法提供,如果将Q_GADGETQ_OBJECT添加到类中,则可以内省该方法——假设它们已经不是QObject。如果您使用QObject,那么您可以通过QMetaObject::invokeMethod或通过Q_GADGET类型上的QMetaMethod::invokeOnGadget以编程方式调用方法,并且除了QObject本身之外,实际上不需要任何公共接口。

示例:

#include <QtCore>
class Class1 {
Q_GADGET
public:
Q_INVOKABLE void foo() { qDebug() << "Class1::foo"; }
};
class Class2 : public QObject {
Q_OBJECT
public:
Q_SLOT void foo() { qDebug() << "Class2::foo"; }
};
class Class3 : public QObject {
Q_OBJECT
public:
Q_SLOT void bar() { qDebug() << "Class3::bar"; }
};
template <class C> QMetaMethod getMethod(const C& c, const char *signature) {
auto const &mo = c.staticMetaObject;
auto const nSignature = QMetaObject::normalizedSignature(signature);
int index = mo.indexOfMethod(nSignature);
if (index >= 0)
return mo.method(index);
return {};
}
int main() {
Class1 c1;
Class2 c2;
Class3 c3;
auto foo1 = getMethod(c1, "foo()");
auto foo2 = getMethod(c2, "foo()");
auto bar3 = getMethod(c3, "bar()");
foo1.invokeOnGadget(&c1);
foo2.invoke(&c2);
bar3.invoke(&c3);  
}
#include "main.moc"

最新更新