Я попытался реализовать метод 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 из главного виджета. Пожалуйста, укажите, где я ошибаюсь в этой реализации.
Вы устанавливаете родительский элемент в 'GuiCentralHandlerPrivate', а затем вы явно удаляете его. Это дважды удаляет объект и, таким образом, сбой. –
Попробуйте заменить 'delete &d_ptr;' '' delete d_ptr; ' – Andrii
@jaac Спасибо за ответ. Я тоже это пробовал. когда я извлекал деструктор удаления в GuiCentralHandler :: ~ GuiCentralHandler(), но она не называет деструктор частного класса csGuiCentralModuleHandlerPrivate :: ~ csGuiCentralModuleHandlerPrivate() { QDebug() << "csGuiCentralModuleHandlerPrivate :: ~ csGuiCentralModuleHandlerPrivate()"; } – Wagmare