[Interest] correct d_ptr implementation

Constantin Makshin cmakshin at gmail.com
Mon Nov 11 18:33:56 CET 2013


1) put your 'd_ptr' into a smart pointer of some kind (usually
QScopedPointer), your example leaks memory;
2) placing 'q_ptr' in the public section doesn't make much sense because
it's supposed to be used only by the DisplayWidgetPrivate instance to
access its "owner" (DisplayWidget doesn't need any external information
to access itself :) );
3) I guess the second "public" section in DisplayWidgetPrivate was
supposed to be "private" :) .

Other than that, your example looks OK to me.

On 11/11/2013 06:40 PM, Graham Labdon wrote:
> Hi
> I am developing a library and in Qt Tradition I want to use the d_ptr
> pattern.
> I have no previous experience of using this pattern and have a simple
> example working but wanted to check that my implementation is correct.
> To that end I have set out my classes below and would be grateful if
> anyone could confirm that my approach is correct(or not)
>  
> Thanks
>  
> Header file
>  
> #ifndef DISPLAYWIDGET_H
> #define DISPLAYWIDGET_H
> #include "DisplayWidgetsGlobal.h"
> #include <QWidget>
>  
> class DisplayWidgetPrivate;
>  
> class DISPLAYWIDGETS_EXPORT DisplayWidget : public QWidget
> {
>         Q_OBJECT
>  
> public:
>         DisplayWidget(QWidget *parent);
>         ~DisplayWidget();
>  
> private:
>         DisplayWidgetPrivate* d_ptr;
>         Q_DECLARE_PRIVATE(DisplayWidget)
> };
>  
> #endif // DISPLAYWIDGET_H
>  
>  
> Private Header file
>  
> #include "DisplayWidget.h"
>  
> class QLabel;
> class DisplayWidgetPrivate
> {
> public:
>         DisplayWidgetPrivate (DisplayWidget* parent);
>         void init();
>  
>         QLabel* m_label;
>         DisplayWidget* const q_ptr;
>         Q_DECLARE_PUBLIC(DisplayWidget)
>  
> public:
>         DisplayWidgetPrivate();
> };
>  
>  
> Implementation file
>  
> #include <QLabel>
> #include "DisplayWidget.h"
> #include "DisplayWidget_p.h"
>  
> DisplayWidgetPrivate::DisplayWidgetPrivate(DisplayWidget* parent)
>         : q_ptr(parent)
> {
>  
> }
>  
> void DisplayWidgetPrivate::init()
> {
>         m_label = new QLabel("This is a label",q_ptr);
> }
>  
> DisplayWidget::DisplayWidget(QWidget *parent)
>         : QWidget(parent),
>           d_ptr(new DisplayWidgetPrivate(this))
> {
>         Q_D(DisplayWidget);
>         d->init();
> }
>  
> DisplayWidget::~DisplayWidget()
> {
>  
> }

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20131111/2b26a260/attachment.sig>


More information about the Interest mailing list