0

我正在尝试学习如何使用来自
http://qt-project.org/wiki/Dpointer#7969fa90723037d326b77fb11381044e的 qt 示例从低音类继承 d 指针

我已经从网站上逐字复制了它,只做了一点修改,所以代码看起来像这样:

小部件.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 */

小部件_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 */

小部件.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中尝试过这个,我或多或少地得到了相同的错误,所以问题必须在代码中,但我不知道在哪里。

4

2 回答 2

0

LabelPrivate公开派生自WidgetPrivate,并且您不会在其成员初始化列表中调用适当的 参数,并采用构造函数( WidgetPrivate(Widget *)) 。WidgetPrivate

您要么调用适当的构造函数,要么提供一个WidgetPrivate不带参数的构造函数。

请注意,如果您为您的类提供任何构造函数,编译器不会为默认的无参数构造函数提供任何构造函数,那么应用的基本原理是,由于您需要定义一个构造函数,您可能需要自己定义每个构造函数。

于 2013-06-17T19:00:29.870 回答
0

LabelPrivate继承自WidgetPrivate,后者没有默认构造函数,只有一个带有Widget *. 编译器生成的默认构造函数LabelPrivate将尝试默认构造其基类 ( WidgetPrivate),从而导致错误。你的类定义需要是这样的:

struct LabelPrivate : public WidgetPrivate 
{      
  LabelPrivate( Widget *w ) : WidgetPrivate( w ) {}  
  String text;
};
于 2013-06-17T19:03:03.587 回答