首页 > 后端开发 > C++ > 如何在 C 中使用 Qt PIMPL 习惯用法?

如何在 C 中使用 Qt PIMPL 习惯用法?

Patricia Arquette
发布: 2024-10-23 14:44:44
原创
848 人浏览过

How to Use the Qt PIMPL Idiom in C  ?

使用 Qt 的 PIMPL 惯用法

简介

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 &amp;);
};</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

Q_DECLARE_PRIVATE 宏简化了 PIMPL 类的声明并将其与接口类关联起来。它生成 d_func() 辅助方法的内联实现,该方法提供对具有适当常量的 PIMPL 的访问。

Q_PRIVATE_SLOT

此宏用于 Qt 4 兼容性或针对非 C 11 时编译器。它声明了一个供内部使用的私有槽。

Q_DECLARE_PUBLIC

Q_DECLARE_PUBLIC 宏提供从 PIMPL 访问接口的权限。它生成 q_func() 辅助方法的内联实现,类似于 d_func()。

常见问题

  • PIMPL 类不应该是接口类本身内的私有类。
  • 对于像 QObject 这样的不可复制/不可分配的类,PIMPL 指针应该是 const。
  • 出于性能原因,避免使用放置 new 和 Fast Pimpl 习惯用法。

非 QObject 可复制类

PIMPL 习惯用法也可用于可复制的非 QObject 类。但是,PIMPL 指针必须是非常量。应实现四法则(复制构造函数、移动构造函数、赋值运算符、析构函数)和独立的交换函数。

以上是如何在 C 中使用 Qt PIMPL 习惯用法?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板