2016-10-05 3 views
1

Я попытался реализовать метод PIMPL использования D_ptr в виджетах Qt.с использованием деструктора реализации D_ptr

Следующий код - это то, что я реализовал.

class GuiCentralHandler : public QWidget 
{ 
    Q_OBJECT 
public: 
    GuiCentralHandler (QWidget *parent = 0); 
    ~GuiCentralHandler(); 

protected: 
    GuiCentralHandlerPrivate * const d_ptr; 

private: //class methods 
    Q_DECLARE_PRIVATE(GuiCentralHandler) 
}; 

GuiCentralHandler ::GuiCentralHandler (QWidget *parent) 
    :QWidget(parent),d_ptr(new GuiCentralHandlerPrivate (this)) 
{ 
} 

GuiCentralHandler ::~GuiCentralHandler() 
{ 
    Q_D(GuiCentralHandler); 
    delete &d_ptr; 
} 

и мой личный d_ptr является

class GuiCentralHandlerPrivate 
{ 
    Q_DECLARE_PUBLIC(GuiCentralHandlerPrivate) 
public: 
    GuiCentralHandlerPrivate (GuiCentralHandler *parent); 

protected: 
    GuiCentralHandler * const q_ptr; 
}; 

GuiCentralHandlerPrivate ::GuiCentralHandlerPrivate (GuiCentralHandler *parent) 
    : q_ptr(parent) 
{ 
} 

Но когда я называю деструктор GuiCentralHandler ::~GuiCentralHandler() это происходит сбой. Как я могу удалить d_ptr или d_func из главного виджета. Пожалуйста, укажите, где я ошибаюсь в этой реализации.

+1

Вы устанавливаете родительский элемент в 'GuiCentralHandlerPrivate', а затем вы явно удаляете его. Это дважды удаляет объект и, таким образом, сбой. –

+1

Попробуйте заменить 'delete &d_ptr;' '' delete d_ptr; ' – Andrii

+0

@jaac Спасибо за ответ. Я тоже это пробовал. когда я извлекал деструктор удаления в GuiCentralHandler :: ~ GuiCentralHandler(), но она не называет деструктор частного класса csGuiCentralModuleHandlerPrivate :: ~ csGuiCentralModuleHandlerPrivate() { QDebug() << "csGuiCentralModuleHandlerPrivate :: ~ csGuiCentralModuleHandlerPrivate()"; } – Wagmare

ответ

1

Вы должны передать указатель на operator delete вместо адреса указателя:

delete d_ptr; 

Вместо:

delete &d_ptr; 

Here, вы можете найти информацию о г-указатель