gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:19:29 25 4
gpt4 key购买 nike

我有一个看起来像这样的 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 不适用于模板类外,它可能会起作用。我有哪些选择?

最佳答案

执行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将能够处理它。模板类的存在只是为了创建具有编译时分派(dispatch)的静态方法,而不必一次又一次地编写它,也不必每次调用它时都重复自己。如果没有,您可以随时回退到第一个版本。

关于c++ - 如何在静态方法中实例化当前类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15777161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com