【发布时间】:2016-09-12 09:23:26
【问题描述】:
我一直在尝试按照this Qt wiki page 上的说明实现一个 Pimpl 类,其中私有类继承自另一个私有基类。
这是一个基本的例子:
基类
标题
// gadget.h
#ifndef GADGET_H
#define GADGET_H
#include <QWidget>
class GadgetPrivate;
class Gadget : public QWidget
{
Q_OBJECT
public:
explicit Gadget(QWidget *parent = 0);
~Gadget();
protected:
Gadget(GadgetPrivate &d, QWidget *parent = 0);
GadgetPrivate *d_ptr;
private:
Q_DISABLE_COPY(Gadget)
Q_DECLARE_PRIVATE(Gadget)
};
#endif // GADGET_H
实施
// gadget.cpp
#include "gadget.h"
#include "gadget_p.h"
Gadget::Gadget(QWidget *parent)
: QWidget(parent),
d_ptr(new GadgetPrivate(this))
{}
Gadget::~Gadget() {}
Gadget::Gadget(GadgetPrivate &d, QWidget *parent)
: QWidget(parent),
d_ptr(&d)
{}
私人课
// gadget_p.h
#ifndef GADGET_P_H
#define GADGET_P_H
#include "gadget.h"
class GadgetPrivate
{
Q_DECLARE_PUBLIC(Gadget)
public:
GadgetPrivate(Gadget *q);
Gadget *q_ptr;
};
GadgetPrivate::GadgetPrivate(Gadget *q)
: q_ptr(q)
{}
#endif // GADGET_P_H
子类
标题
// gizmo.h
#ifndef GIZMO_H
#define GIZMO_H
#include "gadget.h"
class GizmoPrivate;
class Gizmo : public Gadget
{
Q_OBJECT
public:
explicit Gizmo(QWidget *parent = 0);
~Gizmo();
private:
Q_DISABLE_COPY(Gizmo)
Q_DECLARE_PRIVATE(Gizmo)
};
#endif // GIZMO_H
实施
// gizmo.cpp
#include "gizmo.h"
#include "gadget_p.h"
class GizmoPrivate : public GadgetPrivate
{
Q_DECLARE_PUBLIC(Gizmo)
public:
GizmoPrivate(Gizmo *q);
};
GizmoPrivate::GizmoPrivate(Gizmo *q)
: GadgetPrivate(q)
{}
Gizmo::Gizmo(QWidget *parent)
: Gadget(*new GizmoPrivate(this), parent)
{}
Gizmo::~Gizmo() {}
我收到以下错误:
In function `GadgetPrivate::GadgetPrivate(Gadget*)':
error: multiple definition of `GadgetPrivate::GadgetPrivate(Gadget*)'
有人知道我在这里做错了什么吗?
【问题讨论】:
标签: c++ qt inheritance pimpl-idiom