1

Q_D マクロを使用して、派生クラスで d ポインターを使用したいと考えています。

ここに私の親クラスがあります:

class DIGIKAM_EXPORT GraphicsDImgView : public QGraphicsView
{
    Q_OBJECT

public:
    class GraphicsDImgViewPrivate;

protected:
    GraphicsDImgViewPrivate* const d_ptr;

protected:
    Q_DECLARE_PRIVATE(GraphicsDImgView)
};

そして私のGraphicsDImgViewPrivateクラス:

class GraphicsDImgView::GraphicsDImgViewPrivate
{
public:

    GraphicsDImgViewPrivate()
    {
        scene            = 0;
        item             = 0;
        layout           = 0;
        cornerButton     = 0;
        panIconPopup     = 0;
        movingInProgress = false;
        showText         = true;
    }

    QGraphicsScene*           scene;
    GraphicsDImgItem*         item;
    SinglePhotoPreviewLayout* layout;

    QToolButton*              cornerButton;
    KPopupFrame*              panIconPopup;

    QPoint                    mousePressPos;
    QPoint                    panningScrollPos;
    bool                      movingInProgress;
    bool                      showText;
};

GraphicsDImgView::GraphicsDImgView(QWidget* const parent)
    : QGraphicsView(parent), d_ptr(new GraphicsDImgViewPrivate)
{
    Q_D(GraphicsDImgView);
    d->scene  = new QGraphicsScene(this);
    d->scene->setItemIndexMethod(QGraphicsScene::NoIndex);

    setScene(d->scene);
    d->layout = new SinglePhotoPreviewLayout(this);
    d->layout->setGraphicsView(this);
}

派生クラスでは、GraphicsDImgView の d ポインターを使用するメソッドを記述します。

bool ImageRegionWidget::movingInProgress()
{
    Q_D(GraphicsDImgView);
    return d->movingInProgress;
}

ただし、ビルドにより次のエラーメッセージが表示されます

メンバー関数 'bool Digikam::ImageRegionWidget::movingInProgress()':...path.... エラー: 不完全な型 'class GraphicsDImgView::GraphicsDImgViewPrivate' の無効な使用</p>

graphicsdimgview.h:128:11: エラー: 「class GraphicsDImgView::GraphicsDImgViewPrivate」の前方宣言</p>

ドキュメントに正確に従ったので、どこが間違っていたのかわかりません。たぶん私は不注意です。私の間違いを指摘するのを手伝ってください。ありがとう :)

4

1 に答える 1

3

あなたのサンプルの誤りを訂正することはできません。コードは静かで汚れていて不明瞭です。そのような推奨事項が得られる記事を知りません。私の提案は、次の方法で pimpl を行うことです。

MyClass.h

class MyClassPrivate;
class MyClass
    : public QObject
{
Q_OBJECT
public:
  explicit MyClass(QObject *parent = 0);
~MyClass()
protected:
  MyClassPrivate * const d_ptr;
  MyClass(MyClassPrivate &dd, QObject * parent);
private:
  Q_DECLARE_PRIVATE(MyClass);
};

MyClass_p.h

#include "myclass.h"

class MyClassPrivate
{
  Q_DECLARE_PUBLIC(MyClass);
public:
  MyClassPrivate();
  virtual ~MyClassPrivate();

  MyClass * q_ptr;
};

MyClass.cpp

#include "myclass.h"
#include "myclass_p.h"

MyClassPrivate::MyClassPrivate()
{}

MyClassPrivate::~MyClassPrivate()
{}

MyClass::MyClass(QObject *parent)
  :QObject(parent)
  ,d_ptr(new MyClassPrivate())
{
  Q_D(MyClass);
  d->q_ptr = this;
}

MyClass::MyClass(MyClassPrivate &dd, QObject * parent)
  :QObject(parent)
  ,d_ptr(&dd)
{
  Q_D(MyClass);
  d->q_ptr = this;
}

MyClass::~MyClass()
{
  Q_D(MyClass);
  delete d;
}
于 2013-08-01T13:39:31.267 に答える