> 백엔드 개발 > C++ > C에서 Qt PIMPL 관용구를 사용하는 방법은 무엇입니까?

C에서 Qt PIMPL 관용구를 사용하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-23 14:44:44
원래의
847명이 탐색했습니다.

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 클래스인 CoordinateDialogPrivate는 구현 파일에 정의되어 있습니다.

<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 클래스 선언을 단순화하고 이를 인터페이스 클래스와 연결합니다. 적절한 상수를 사용하여 PIMPL에 대한 액세스를 제공하는 d_func() 도우미 메서드의 인라인 구현을 생성합니다.

Q_PRIVATE_SLOT

이 매크로는 Qt 4 호환성 또는 비C 11을 대상으로 할 때 사용됩니다. 컴파일러. 내부 사용을 위한 전용 슬롯을 선언합니다.

Q_DECLARE_PUBLIC

Q_DECLARE_PUBLIC 매크로는 PIMPL에서 인터페이스에 대한 액세스를 제공합니다. d_func()와 유사한 q_func() 도우미 메서드의 인라인 구현을 생성합니다.

일반적인 문제

  • PIMPL 클래스는 인터페이스 클래스 자체 내에서 비공개 클래스가 되어서는 안 됩니다.
  • QObject와 같은 복사 불가능/할당 불가능 클래스의 경우 PIMPL 포인터는 const여야 합니다.
  • 성능상의 이유로 배치 new 및 Fast Pimpl 관용구를 사용하지 마십시오.

QObject가 아닌 복사 가능한 클래스

PIMPL 관용구는 복사 가능한 QObject가 아닌 클래스에도 사용할 수 있습니다. 그러나 PIMPL 포인터는 const가 아니어야 합니다. 4의 법칙(복사 생성자, 이동 생성자, 할당 연산자, 소멸자)과 독립형 스왑 기능을 구현해야 합니다.

위 내용은 C에서 Qt PIMPL 관용구를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿