2013-04-03 46 views
1

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

回答

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能够处理它。模板类仅仅是为了创建具有编译时间调度的静态方法而不必一次又一次地编写它,并且每次调用它时不必重复自己。如果没有,你可以回到第一个版本。

+0

非常有趣的想法。谢谢! –