我一直在为一个有插件的项目重构一些代码。该插件基本上实现了(纯虚拟)接口。
但是,有些插件使用了大量的共享代码,目前这些代码是作为存档库构建的,并链接到每个插件dll中。在课堂形式中,它是这样的:
class PluginA : public Common {
QOBJECT
Q_PLUGIN_METADATA(IID "org.me.PluginA" FILE "pluginA.json")
public:
virtual void Func1() override { do stuff; }
//virtual void Func2() override implemented in Common
virtual void Func3() override { Common::Func3(); fiddle() }
};
//pluginB in a different DLL does similar things
然后这是一个静态库,它由pluginA和pluginB
链接class Common : public SomeInterface {
public:
//virtual void Func1() override //implemented by plugin
virtual void Func2 override { magic stuff, probably calling func2; }
virtual void Func3() override { stuff; }
}
最后是只存在于头文件中的接口
class Someinterface {
public:
virtual void Func1() = 0;
virtual void Func2() = 0;
virtual void Func3() = 0;
}
现在,正如我所说,我想让Common成为一个插件模块。如果我这样做而不添加Q_PLUGIN_METADATA行,则不会添加任何内容作为入口点,并且链接会奇怪地失败
如果我添加Q_PLUGIN_METADATA行,QT中的某些内容会尝试实例化Common类的对象,但由于它没有实现所有函数(例如可能返回名称的Func1),因此不起作用。 ..)
我可以假设实现了一个虚函数,如果它被调用则引发异常,但是这会使得在某种程度上实现新的PluginC变得困难,因为你不会因为没有实现编译错误函数,你会得到运行时错误。
我可以采取哪些方法?请注意,还有其他插件直接从SomeInterface继承,不需要/使用pluginA和pluginB使用的公共代码。