如何在静态方法中实例化当前类的实例
How to instantiate an instance of the current class in a static method?
我有一个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();
}
…产生以下链接器错误:
错误:对' void MyClass::createInstance()'的未定义引用'
这个答案可能是有效的,除了moc
不能与模板类一起工作。我有什么选择?
将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
将能够处理它。模板类的存在仅仅是为了创建具有编译时调度的静态方法,而不必一遍又一遍地编写它,也不必每次调用它时都重复自己。如果不是,你总是可以回到第一个版本。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 如何使用另一个模板化类的实例模板化类?
- DLLexport 类模板实例(专用化),减少了仅标头模板库的编译时间
- 是否可以使用将不同参数传递给构造函数的类的不同实例初始化向量
- 是否为类的每个实例实例化了私有类变量
- C++ - 使用实例初始化类成员
- 如何为模板类的所有实例专用化或重载全局模板函数
- 编译时的单一实例初始化
- c++变量/实例初始化跨不同翻译单元的顺序
- 用临时实例初始化对象
- 只在类的第一个实例初始化时调用的成员函数(c++)
- c++ STL容器.为每个不同的实例参数化比较器
- 使用另一个类的多个实例初始化