我有一个Qt类看起来像这样:
class MyClass : public QObject
{
Q_OBJECT
public:
virtual void doSomething();
static void createInstance();
};
createInstance
方法应该创建当前类的实例并在其上调用doSomething
方法。例如,如果我创建名为MyOtherClass
的派生类,createInstance
应该创建MyOtherClass
的实例并在该实例上调用doSomething
。
起初我认为模板可能是一个解决方案,但是以下代码:
template <typename T>
static void createInstance();
// ...in myclass.cpp...
template <typename T>
void MyClass::createInstance()
{
T().doSomething();
}
...产生以下链接器错误:
error: undefined reference to `void MyClass::createInstance<MyOtherClass>()'
This answer可能有效,但moc
不适用于模板类。我有什么选择?
答案 0 :(得分:2)
将createInstance
的实现放在头文件中。使用createInstance<Foo>
的每个编译单元都需要能够创建实现。
作为改进,创建一个双层系统:
class MyClassBase: public QObject {
Q_OBJECT
public:
virtual void doSomething() = 0;
};
template<typename Derived>
class MyClass: public MyClassBase {
public:
static void createInstanceAndDoSomething() {
Derived d;
d.doSomething();
}
};
然后,当从MyClass继承时,传入派生类:
class DerivedClass: MyClass<DerivedClass> {
// ...
};
你也可以抛出一些静态(或者,如果你的编译器没有那个)运行时声明Derived
是MyClass<Derived>
体中MyClass<Derived>
的派生类。只是为了保持理智。
只在具体类中使用Q_OBJECT
(而不是在模板类中),我希望你的moc
能够处理它。模板类只是为了创建带编译时调度的静态方法而不必一次又一次地重写,而不必每次调用它时都重复自己。如果没有,您可以随时回到第一个版本。