带有QT的Pimpl成语
Pimpl idiom with Qt
我正在尝试使用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
继承,则无法转发声明。您必须包含其完整定义。
相关文章:
- Qt中的实现指针(PIMPL)
- 如何在C++中最好地实施"newtype"成语?
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- 为什么在PIMPL中无法访问实现类的常量函数?
- 当我不关心顺序并且没有重复项时,更快的擦除删除成语?
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- 痘痘成语和交换
- C++从"NameBase"类到模板"Name"类的相互关系的成语(或模式)
- 范围TS成语和神秘的汽车&&
- 检测功能失败static_assert成语
- 擦除删除成语的性能增益从何而来
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- C++详细介绍命名空间 vs 匿名 vs 私有方法到类 vs. pimpl vs. 朋友类
- 为什么擦除-删除成语不适用于反向迭代器
- C PIMPL成语,类模板和void模板参数
- PIMPL成语澄清
- 带有QT的Pimpl成语
- C4150:删除指向不完整类型和PIMPL成语的指针
- PIMPL 成语 VS 前向声明
- PIMPL 成语可访问性问题