[Interest] correct d_ptr implementation
andre at familiesomers.nl
andre at familiesomers.nl
Mon Nov 11 19:22:35 CET 2013
Constantin Makshin schreef op 11.11.2013 18:33:
> 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.
>
How much sense does it make to have a private section in the private
DisplayWidgetPrivate class at all? Everything in there is private for
DisplayWidgets use anyway, right?
André
> 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()
>> {
>>
>> }
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
More information about the Interest
mailing list