Russian Qt Forum
Ноябрь 27, 2024, 10:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Деструктор по умолчанию  (Прочитано 7279 раз)
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. Класс о них позаботится?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Сентябрь 24, 2010, 19:09 »

нет
Записан
Astrologer
Гость
« Ответ #2 : Сентябрь 24, 2010, 19:11 »

То есть явным образом определять деструктор и вызывать delete для *? А для остальных что делать? Или просто определить
Код:
QTreeWidget::~QTreeWidget(){}
?
Записан
Astrologer
Гость
« Ответ #3 : Сентябрь 24, 2010, 19:25 »

Из книги Бланшет:

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

Это как понимать?
Записан
Sancho_s_rancho
Гость
« Ответ #4 : Сентябрь 24, 2010, 19:26 »

То есть явным образом определять деструктор и вызывать delete для *? А для остальных что делать? Или просто определить
Код:
QTreeWidget::~QTreeWidget(){}
?
Если вы при создании объекта указываете ему родителя QObject или его наследника, то при уничтожении родителя объекты будут уничтожены. Для всех остальных delete в деструкторе или пользуйтесь умными указателями.
Записан
Astrologer
Гость
« Ответ #5 : Сентябрь 24, 2010, 19:29 »

Всем привет. Когда мы создаем новый класс деструктор по умолчанию не создается.

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

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

class QWizardReport : public QWizard

QWizard наследник QObject так? То есть все удалится?
Записан
Sancho_s_rancho
Гость
« Ответ #6 : Сентябрь 24, 2010, 19:29 »

Из книги Бланшет:

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Сентябрь 24, 2010, 19:29 »

не объявить деструктор == написать QTreeWidget::~QTreeWidget(){}
используйте механизм парент/чайлд
Записан
Astrologer
Гость
« Ответ #8 : Сентябрь 24, 2010, 19:30 »

Я же привел код.  Улыбающийся Про механизм можно поподробнее?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Сентябрь 24, 2010, 19:34 »

Я же привел код.  Улыбающийся Про механизм можно поподробнее?

при создании виджетов указывайте родителя, это уже написано выше.
Записан
Astrologer
Гость
« Ответ #10 : Сентябрь 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 пройдет?
Записан
Sancho_s_rancho
Гость
« Ответ #11 : Сентябрь 24, 2010, 19:46 »

vbox и groupbox назначаются родители не при создании, а через addWidget, но они назначаются. Обо всем этом написано в документации.
Записан
Astrologer
Гость
« Ответ #12 : Сентябрь 24, 2010, 23:56 »

Спасибо за ответы. Но почему нельзя просто сказать - нужно сделать так то и так то, это удалится потому то и потому то?) Я знаю что все есть в документации. Но я обращаюсь к участникам форума для возможности разделить практический опыт и разобраться в тонкостях)
Записан
Astrologer
Гость
« Ответ #13 : Сентябрь 25, 2010, 08:49 »

Может кто нибудь в простых словах объяснить когда объект создается на стеке, в кучу или еще где нибудь или дать хороший источник где все это описывается?
Записан
BRE
Гость
« Ответ #14 : Сентябрь 25, 2010, 09:02 »

Может кто нибудь в простых словах объяснить когда объект создается на стеке, в кучу или еще где нибудь или дать хороший источник где все это описывается?
Это можно почитать в любой книге по С++.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.