【发布时间】:2013-06-13 20:00:58
【问题描述】:
我正在尝试学习如何使用来自
http://qt-project.org/wiki/Dpointer#7969fa90723037d326b77fb11381044e
我从网站上逐字复制了它,只是稍作修改,因此代码如下所示:
小部件.h
#ifndef WIDGET_H
#define WIDGET_H
// FWD
class WidgetPrivate;
// END
class Widget {
public:
Widget();
protected:
// only sublasses may access the below
Widget(WidgetPrivate &d); // allow subclasses to initialize with their own concrete Private
WidgetPrivate *d_ptr;
};
#endif /* WIDGET_H */
widget_p.h
#ifndef WIDGET_P_H
#define WIDGET_P_H
#include <string>
#include "widget.h"
// FWD
class Widget;
// End
typedef int Rect;
typedef std::string String;
struct WidgetPrivate
{
WidgetPrivate(Widget *q) : q_ptr(q) { } // constructor that initializes the q-ptr
Widget *q_ptr; // q-ptr that points to the API class
Rect geometry;
String stylesheet;
};
#endif /* WIDGET_P_H */
widget.cpp
#include "widget.h"
Widget::Widget()
: d_ptr(new WidgetPrivate(this)) {
}
Widget::Widget(WidgetPrivate &d)
: d_ptr(&d) {
}
标签.h
#ifndef LABEL_H
#define LABEL_H
#include "widget.h"
//FWD
class LabelPrivate;
//END
class Label : public Widget {
public:
Label();
protected:
Label(LabelPrivate &d); // allow Label subclasses to pass on their Private
// notice how Label does not have a d_ptr! It just uses Widget's d_ptr.
};
#endif /* LABEL_H */
标签.cpp
#include "label.h"
#include "widget.h"
#include "widget_p.h"
struct LabelPrivate : public WidgetPrivate
{
String text;
};
Label::Label()
: Widget(*new LabelPrivate) // initialize the d-pointer with our own Private
{
}
Label::Label(LabelPrivate &d)
: Widget(d) {
}
当我在 g++ 中编译它时会出现这个错误
label.cpp:5:11: error: no matching function for call to ‘WidgetPrivate::WidgetPrivate()’
我在 clang 中尝试过这个,我得到或多或少相同的错误,所以问题必须在代码中,但我不知道在哪里。
【问题讨论】:
标签: c++ class pointers inheritance