[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