0

假设我有以下玩具界面:

class iTest{
  virtual ~iTest(void) = 0;
  virtual void doA(void) = 0;
  virtual void doB(void) = 0;
}

Q_DECLARE_INTERFACE(iTest, "somestring")

我想在两个类中实现它:Base 和 Derived。

class Base : public QObject, public iTest
{
  Q_OBJECT
  Q_PLUGIN_METADATA (IID "somestring")
  Q_INTERFACES(iTEST)
  explicit Base(QObject* parent=0);
  void doA(void); // do common thing all derived need do
  int data; // some data member all derived should have
}

class Derived: public Base
{
  Q_OBJECT
  Q_PLUGIN_METADATA (IID "somestring")
  Q_INTERFACES(iTEST)
  explicit Derived(QObject* parent = 0);
  void doB(); // do something custom dervived objects need do
}

我错误的推理告诉我这应该有效。插件的抽象基类为接口的一部分提供功能,而派生类构成接口的其余部分。我可以通过一些明智的删除宏(基类元数据宏)来编译它。但是,生成的插件不会加载。所以我认为我的推理有问题,经验丰富的 Qt 开发人员或 c++ 开发人员可能会指出我看不到。

4

1 回答 1

1

我相信我已经想出了一个解决方案。正如上面提到的 Alexander V,Base 和 Derived 类中的 Q_ 宏相互冲突。文档指出,代码中只能调用一次 Q_PLUGIN_METADATA 宏。我想到的是,基类本身甚至不需要是 Q_Object,它只是函数的容器。因此,我重新声明了这些类,如下所示:

class Base: public iTest{
  void doA(void); // do something all derived should do
  int data; // data all derived should have
}

class Derived: public QObject, public Base{
  Q_OBJECT
  Q_PLUGIN_METADATA (IID "somestring")
  Q_INTERFACES(iTEST)  
  void doB(void): // custom to derived
}

此外,界面需要稍作修改:

...
  virtual ~iTest(void){}
...

这是因为析构函数需要被定义,并且不能是纯虚拟的。通过这些修改,这种结构似乎可以在我的应用程序中使用。

于 2018-07-26T16:05:49.243 回答