带有QT的Pimpl成语

Pimpl idiom with Qt

本文关键字:成语 Pimpl QT 带有      更新时间:2023-10-16

我正在尝试使用qt 5.6.0构建共享库,我想使用pimpl。

我有一个类以导出的类,此类从qgraphicsscene继承,该类本身从qobject继承:

// CustomScene.h
#include "customscene_global.h" // recommended header from Qt
#include <QGraphicsScene> // do not compile if not present 
// forward declarations
class CustomSceneImpl;
template <typename T> class QList;
class QString;
template <class Key, class T> class QMap;
// some other classes ...
class CustomScene : public QGraphicsScene
{
  Q_OBJECT
  public :
  // some public functions
  signals:
  // some custom signals
  public slots:
  // some custom public slots
  private:
    CustomSceneImpl *m_pimpl; // pointer to private members
};

如果我在此标头中 #include <QGraphicsScene>,一切都很好,但是我希望转发声明qgraphicsscene。但是,如果这样做,我会收到以下编译错误:

error: invalid use of incomplete type 'struct QGraphicsScene'

我想我对Qobject宏做错了,这是没有识别的,并且通常使用MOC。

我知道有专门的QT宏来使用PIMPL(q_d,..),但我不太了解如何使用它们以及是否可以解决此问题。

感谢您的帮助。

如果我在此标头中 #include QGraphicsScene,一切都很好,但是我更喜欢转发声明qgraphicsscene。

QGraphicsScene继承时,您无法执行此操作:

class CustomScene : public QGraphicsScene

顺便说一句。此错误与您实现Pimpl成语的方式无关(实际上看起来不错),由于编译器需要知道您的小型类的大小/布局。

由于向前声明的类没有有关内容的信息,因此您不能将其用于继承。

您可以使用pimpl成语进行组成,而不是继承。如果您需要从QGraphicsScene继承,则无法转发声明。您必须包含其完整定义。