C++ 带Qt的Pimpl习语

C++ 带Qt的Pimpl习语,c++,qt,pimpl-idiom,C++,Qt,Pimpl Idiom,我正在尝试用Qt5.6.0构建一个共享库,我想使用Pimpl 我有一个类要导出,这个类继承自QGraphicscene,它本身继承自QObject: // CustomScene.h #include "customscene_global.h" // recommended header from Qt #include <QGraphicsScene> // do not compile if not present // forward declarations class

我正在尝试用Qt5.6.0构建一个共享库,我想使用Pimpl

我有一个类要导出,这个类继承自QGraphicscene,它本身继承自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

};
如果我包含在这个标题中,一切都很好,但我更愿意转发声明QGraphicscene。但是,如果这样做,则会出现以下编译错误:

错误:无效地使用不完整的类型“struct qgraphicscene”

我想我在QObject宏和moc上犯了一些错误,这是无法识别的

我知道有专门的Qt宏可以使用Pimpl Q_D。。但我并不真正理解如何使用它们,以及它是否能解决这个问题

谢谢你的帮助

如果我在这个标题中包含QGraphicscene,一切都很好,但我更愿意向前声明QGraphicscene

无法执行此操作,因为您从QGraphicscene继承:

顺便说一句,这个错误与您实现PIMPL习语的方式无关。实际上,它看起来很好,不完整类型的继承是不可能的,因为编译器需要知道基类的大小/布局

如果我在这个标题中包含QGraphicscene,一切都很好,但我更愿意向前声明QGraphicscene

无法执行此操作,因为您从QGraphicscene继承:


顺便说一句,这个错误与您实现PIMPL习语的方式无关实际上它看起来很好,因为编译器需要知道基类的大小/布局,所以从不完整类型继承是不可能的。

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

因为正向声明的类没有关于内容的信息,所以您不能将其用于继承。

您可以将PIMPL习惯用法用于合成,而不是用于继承。如果需要从QGraphicscene继承,则不能向前声明它。您必须包含它的完整定义。

您可以将PIMPL习惯用法用于组合,而不是用于继承。如果需要从QGraphicscene继承,则不能向前声明它。你必须包括它的完整定义。

谢谢,我忘了。谢谢,我忘了。你的问题中有没有什么没有包括在内的?我问,因为我想让另一个涵盖所有角度,所以如果有不清楚的地方,请告诉我,我会解决。事实上,我的问题与继承有关,而不是与实现pimpl的Qt方式有关,但你的解释看起来很好,我会仔细看看,如果我不清楚,请告诉你。谢谢。你的问题中有没有什么没有被讨论的?我问,因为我想让另一个涵盖所有角度,所以如果有不清楚的地方,请告诉我,我会解决。事实上,我的问题与继承有关,而不是与实现pimpl的Qt方式有关,但你的解释看起来很好,我会仔细看看,如果我不清楚,请告诉你。谢谢
class CustomScene : public QGraphicsScene