如何在静态方法中实例化当前类的实例?

时间:2013-04-03 01:04:16

标签: c++ qt templates

我有一个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不适用于模板类。我有什么选择?

1 个答案:

答案 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> {
  // ...
};

你也可以抛出一些静态(或者,如果你的编译器没有那个)运行时声明DerivedMyClass<Derived>体中MyClass<Derived>的派生类。只是为了保持理智。

只在具体类中使用Q_OBJECT(而不是在模板类中),我希望你的moc能够处理它。模板类只是为了创建带编译时调度的静态方法而不必一次又一次地重写,而不必每次调用它时都重复自己。如果没有,您可以随时回到第一个版本。