PIMPL(指向实现的指针)惯用法允许将公共接口与私有实现细节分开一个类,防止该类的用户关心这些细节。 Qt 采用自己的 PIMPL 惯用法实现,记录如下。
Qt 的基于 PIMPL 的接口如下所示:
<code class="cpp">class CoordinateDialog : public QDialog { Q_OBJECT Q_DECLARE_PRIVATE(CoordinateDialog) #if QT_VERSION <= QT_VERSION_CHECK(5,0,0) Q_PRIVATE_SLOT(d_func(), void onAccepted()) #endif QScopedPointer<CoordinateDialogPrivate> const d_ptr; public: CoordinateDialog(QWidget * parent = 0, Qt::WindowFlags flags = 0); ~CoordinateDialog(); QVector3D coordinates() const; Q_SIGNAL void acceptedCoordinates(const QVector3D &); };</code>
这里,Q_DECLARE_PRIVATE 宏声明 PIMPL 类并提供访问它的必要机制。
PIMPL 类 CooperativeDialogPrivate 在实现文件中定义:
<code class="cpp">class CoordinateDialogPrivate { Q_DISABLE_COPY(CoordinateDialogPrivate) Q_DECLARE_PUBLIC(CoordinateDialog) CoordinateDialog * const q_ptr; QFormLayout layout; QDoubleSpinBox x, y, z; QDialogButtonBox buttons; QVector3D coordinates; void onAccepted(); CoordinateDialogPrivate(CoordinateDialog*); };</code>
Q_DECLARE_PRIVATE 宏简化了 PIMPL 类的声明并将其与接口类关联起来。它生成 d_func() 辅助方法的内联实现,该方法提供对具有适当常量的 PIMPL 的访问。
此宏用于 Qt 4 兼容性或针对非 C 11 时编译器。它声明了一个供内部使用的私有槽。
Q_DECLARE_PUBLIC 宏提供从 PIMPL 访问接口的权限。它生成 q_func() 辅助方法的内联实现,类似于 d_func()。
PIMPL 习惯用法也可用于可复制的非 QObject 类。但是,PIMPL 指针必须是非常量。应实现四法则(复制构造函数、移动构造函数、赋值运算符、析构函数)和独立的交换函数。
以上是如何在 C 中使用 Qt PIMPL 习惯用法?的详细内容。更多信息请关注PHP中文网其他相关文章!