0

次のおもちゃのインターフェースがあるとします。

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

Q_DECLARE_INTERFACE(iTest, "somestring")

これを Base と Derived の 2 つのクラスに実装したいと思います。

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 マクロを呼び出すことができるのは 1 つだけであると記載されています。私が思いついたのは、基底クラス自体は 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 に答える