Russian Qt Forum

Qt => Общие вопросы => Тема начата: Astrologer от Сентябрь 24, 2010, 18:57



Название: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 18:57
Всем привет. Когда мы создаем новый класс деструктор по умолчанию не создается.

Например есть такой заголовок:
Код:
#ifndef QWIZARDREPORT_H
#define QWIZARDREPORT_H

#include <QWizard>
#include <QtGui>

#include "qtreecheckable.h"

class QWizardReport : public QWizard
{
Q_OBJECT
public:
    explicit QWizardReport(QWidget *parent = 0);
    QWizardReport(QWidget *parent, QStringList tables_list, QStringList objects_list, QStringList fields_list);
    QWizardPage* createIntroPage();
    QWizardPage* createSelectTablePage();
    QStringList tablesList;
    QStringList objectsList;
    QStringList fieldsList;
    QStringList outObjectsList;
    QStringList outFieldsList;
    QStringList outTablesList;
    QStringList outAverageList;
    QStringList outOrderList;
    QStringList queues;
    QTreeCheckable * fieldsTree;
    QTreeCheckable * averageTree;
    QTreeCheckable* criterionTree;
    QPushButton* clearButton;
    QString outQueue;

    QGroupBox *createFieldsGroup();
    QGroupBox *createStatisticGroup();
    QGroupBox *createOrderGroup();

    QGroupBox* fieldsBox;
    QGroupBox* statisticsBox;
    QGroupBox* orderBox;

    void saveSQL(QString query, QString path);

signals: void refreshLists();
public slots:
    void createWidgets();
    void setObjectList(QStringList list);
    void setFieldsList(QStringList list);
    void setTablesList(QStringList list);
    void refreshListSlot();
    void createQueue();
};

#endif // QWIZARDREPORT_H
CPP:
Код:
void QWizardReport::createWidgets()
{
     clearButton = new QPushButton;
     fieldsTree = new QTreeCheckable;
     averageTree = new QTreeCheckable;
     criterionTree = new QTreeCheckable;
     fieldsBox = new QGroupBox;
     statisticsBox = new QGroupBox;
     orderBox = new QGroupBox;
     clearButton->setText("Clear");
}
Что произойдет со всеми указателями типа QGroupBox* , и обычными объектами QStringList. Класс о них позаботится?


Название: Re: Деструктор по умолчанию
Отправлено: Авварон от Сентябрь 24, 2010, 19:09
нет


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 19:11
То есть явным образом определять деструктор и вызывать delete для *? А для остальных что делать? Или просто определить
Код:
QTreeWidget::~QTreeWidget(){}
?


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 19:25
Из книги Бланшет:

Когда мы создаем объект и он имеет родительский объект, то к списку дочерних элементов родителя добавляется и этот объект. При удалении родителя все дочерние элементы будут удалены.

Это как понимать?


Название: Re: Деструктор по умолчанию
Отправлено: Sancho_s_rancho от Сентябрь 24, 2010, 19:26
То есть явным образом определять деструктор и вызывать delete для *? А для остальных что делать? Или просто определить
Код:
QTreeWidget::~QTreeWidget(){}
?
Если вы при создании объекта указываете ему родителя QObject или его наследника, то при уничтожении родителя объекты будут уничтожены. Для всех остальных delete в деструкторе или пользуйтесь умными указателями.


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 19:29
Всем привет. Когда мы создаем новый класс деструктор по умолчанию не создается.

Например есть такой заголовок:
Код:
#ifndef QWIZARDREPORT_H
#define QWIZARDREPORT_H

#include <QWizard>
#include <QtGui>
#include "qtreecheckable.h"

class QWizardReport : public QWizard

QWizard наследник QObject так? То есть все удалится?


Название: Re: Деструктор по умолчанию
Отправлено: Sancho_s_rancho от Сентябрь 24, 2010, 19:29
Из книги Бланшет:

Когда мы создаем объект и он имеет родительский объект, то к списку дочерних элементов родителя добавляется и этот объект. При удалении родителя все дочерние элементы будут удалены.

Это как понимать?
если QPushButton *btn = new QPushButton(this); //когда этот this будет удаляться, то удалиться и кнопка.
если QPushButton *btn = new QPushButton();//надо руками вызывать delete.


Название: Re: Деструктор по умолчанию
Отправлено: Авварон от Сентябрь 24, 2010, 19:29
не объявить деструктор == написать QTreeWidget::~QTreeWidget(){}
используйте механизм парент/чайлд


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 19:30
Я же привел код.  :) Про механизм можно поподробнее?


Название: Re: Деструктор по умолчанию
Отправлено: Alex Custov от Сентябрь 24, 2010, 19:34
Я же привел код.  :) Про механизм можно поподробнее?

при создании виджетов указывайте родителя, это уже написано выше.


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 19:41
Код из Qt:
Код:
#include <QtGui>

 #include "window.h"

 Window::Window(QWidget *parent)
     : QWidget(parent)
 {
     QGridLayout *grid = new QGridLayout;
     grid->addWidget(createFirstExclusiveGroup(), 0, 0);
     grid->addWidget(createSecondExclusiveGroup(), 1, 0);
     grid->addWidget(createNonExclusiveGroup(), 0, 1);
     grid->addWidget(createPushButtonGroup(), 1, 1);
     setLayout(grid);

     setWindowTitle(tr("Group Boxes"));
     resize(480, 320);
 }

 QGroupBox *Window::createFirstExclusiveGroup()
 {
     QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));

     QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
     QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
     QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));

     radio1->setChecked(true);

     QVBoxLayout *vbox = new QVBoxLayout;
     vbox->addWidget(radio1);
     vbox->addWidget(radio2);
     vbox->addWidget(radio3);
     vbox->addStretch(1);
     groupBox->setLayout(vbox);

     return groupBox;
 }
Куда девается vbox, groupbox? Указывать родителя не подходит. delete stringList пройдет?


Название: Re: Деструктор по умолчанию
Отправлено: Sancho_s_rancho от Сентябрь 24, 2010, 19:46
vbox и groupbox назначаются родители не при создании, а через addWidget, но они назначаются. Обо всем этом написано в документации.


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 24, 2010, 23:56
Спасибо за ответы. Но почему нельзя просто сказать - нужно сделать так то и так то, это удалится потому то и потому то?) Я знаю что все есть в документации. Но я обращаюсь к участникам форума для возможности разделить практический опыт и разобраться в тонкостях)


Название: Re: Деструктор по умолчанию
Отправлено: Astrologer от Сентябрь 25, 2010, 08:49
Может кто нибудь в простых словах объяснить когда объект создается на стеке, в кучу или еще где нибудь или дать хороший источник где все это описывается?


Название: Re: Деструктор по умолчанию
Отправлено: BRE от Сентябрь 25, 2010, 09:02
Может кто нибудь в простых словах объяснить когда объект создается на стеке, в кучу или еще где нибудь или дать хороший источник где все это описывается?
Это можно почитать в любой книге по С++.


Название: Re: Деструктор по умолчанию
Отправлено: Пантер от Сентябрь 25, 2010, 12:57
Может кто нибудь в простых словах объяснить когда объект создается на стеке, в кучу или еще где нибудь или дать хороший источник где все это описывается?
Это можно почитать в любой книге по С++.
Скорее это нужно почитать в любой книге по С++.