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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Почему все объекты qt в динамической памяти?  (Прочитано 27239 раз)
Steven_Orko
Гость
« Ответ #15 : Сентябрь 29, 2009, 09:45 »

Да нормальный препод!
Скорей всего это просто провокация с его стороны чтоб побудить студента к исканиям причин, студент под таким "гнетом" лучше разберется в вопросе.
+1

Препод нормальный, а ваш друг .... одним словом - студент. Тупо код переписывает из примеров не вникая в истину. Даже если это не провокация и препод сам не знает как нужно, он правильно делает, что заставляет обосновать своё решение студента и найти истину.
+1
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Сентябрь 29, 2009, 12:34 »

Я удивлен (хотя с преподаванием никак не связан). Преподаватель задает абсолютно НОРМАЛЬНЫЙ, несложный, общий вопрос на который легко найти 3-4 варианта ответа (скорее всего устроит любой). Просто пусть друг ответит (прочитав эту тему) - да и дело с концом Улыбающийся
Записан
BlackTass
Гость
« Ответ #17 : Сентябрь 29, 2009, 13:41 »

Я удивлен (хотя с преподаванием никак не связан). Преподаватель задает абсолютно НОРМАЛЬНЫЙ, несложный, общий вопрос на который легко найти 3-4 варианта ответа (скорее всего устроит любой). Просто пусть друг ответит (прочитав эту тему) - да и дело с концом Улыбающийся

если нижеследующее это слова препода
Цитировать
Мне нужна более весомая причина, желательно от самих разработчиков библиотеки.

то тут не все так просто. Подобные вещи никакой программист не будет както обосновывать в документации своей библиотеки, так как это является базовыми вещами. Следовательно ответ фиг найдешь)
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #18 : Сентябрь 30, 2009, 10:55 »

Цитировать
Почему все объекты qt в динамической памяти?
А на самом деле интересный вопрос. Я сам не когда не думал об этом. Но в последнее время всё чаще к нему возвращаюсь. Перечитал книжки, погуглил ..... ответа не нашел, и решил что нет ни какой разницы в динамике или в статике. А в доках на Qt все в динамике из-за стиля программирования. ИМХО.

Вот пример из асистанта Fortune Client Example

Код:
///client.h
сlass Client : public QDialog
 {
     Q_OBJECT

 public:
     Client(QWidget *parent = 0);
...
 private:
     QPushButton *quitButton;
     QDialogButtonBox *buttonBox;
...

 };

///!!!client.cpp
Client::Client(QWidget *parent)
     : QDialog(parent)
 {   

     quitButton = new QPushButton(tr("Quit"));

     buttonBox = new QDialogButtonBox;
     buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
   
     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
....
     QGridLayout *mainLayout = new QGridLayout;
     mainLayout->addWidget(buttonBox, ....);
     setLayout(mainLayout);
....
 }


Зачем в классе client присутствуют  quitButton и buttonBox указатели и сами объекты в "динамике"? Почему бы не сделать эти объекты членами класса?  Мне кажется, что сделав кнопку quitButton членом класса client на работу программы не повлияет (если конечно не будет вызываться копирующий конструктор client).

ps И вообще на мой взгляд это кривой пример. Я бы вообще членом класса не делал бы кнопку quit
Код:
///client.h
[code]lass Client : public QDialog
 {
     Q_OBJECT

 public:
     Client(QWidget *parent = 0);
...

 };

///!!!client.cpp
Client::Client(QWidget *parent)
     : QDialog(parent)
 {   

     quitButton = new QPushButton(tr("Quit"));

     QPushButton *buttonBox = new QDialogButtonBox;
     ButtonBox *buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
   
     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
....
     QGridLayout *mainLayout = new QGridLayout;
     mainLayout->addWidget(buttonBox, ....);
     setLayout(mainLayout);
....
 }

[/code]

Я думаю, что Троли любят всё в динамике, даже hellow Qt у них написано в "недобросовестном" стиле ("Qt4: Программирование GUI на С++" 1-ое издание), т.е. без зачистки, и это они не считают за утечку памяти.
Код:
int main(int argc, char *argv[])
{
Application app(argc, argv);
Qlabel *label = new QLabel ("Hellow Qt!");
label->show();
return app.exec();

}

Хотя в 2009 ассистанте уже hellow word "добросовестный".

Я бы так ответил преподу: "Абсолютно нет тик какой разницы в динамике, или в статике.Поэтому выбрал динамику. Если Вы требуете сделать статические члены - то обоснуйте  -  во имя какой великой цели необходимо переделывать весь код?" ну или что-то того. Интересно послушать, что он скажет
Записан
spirit
Гость
« Ответ #19 : Сентябрь 30, 2009, 11:03 »

а ты пропробуй создать виджет без парента, что получишь?
к тому же в ашник придется подключать ашники других объектов,
а это уменьшит скорость компиляции.
« Последнее редактирование: Сентябрь 30, 2009, 11:08 от spirit » Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #20 : Сентябрь 30, 2009, 11:31 »

Цитировать
а ты пропробуй создать виджет без парента, что получишь?
получу виджет без парента. Практически везде в примерах ассистента создаются виджеты без парента, например в томже client.cpp
Код:
quitButton = new QPushButton(tr("Quit"));
Или я тебя не понял Непонимающий
Записан
spirit
Гость
« Ответ #21 : Сентябрь 30, 2009, 11:38 »

он создастся в отдельном окне, если конечно не делать явный репарент или юзать компоновщики.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #22 : Сентябрь 30, 2009, 11:39 »

Я бы так ответил преподу: "Абсолютно нет тик какой разницы в динамике, или в статике."

1) Почитай про модели памяти - кучу и стек, почитай про размещение объектов в них. Подумай над разницей...

2) Про копирующий конструктор уже упомянули
« Последнее редактирование: Сентябрь 30, 2009, 14:27 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #23 : Сентябрь 30, 2009, 11:43 »

получу виджет без парента. Практически везде в примерах ассистента создаются виджеты без парента, например в томже client.cpp

Парент устанавливается. По этому поводу почитай про компоновку виджетов, посмотри исходные коы компоновщиков
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
SABROG
Гость
« Ответ #24 : Сентябрь 30, 2009, 12:00 »

Кстати еще разница в том, что операция выделения памяти в куче (через new) медленнее чем в стеке. Но это наверно видно будет только на больших списках.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Сентябрь 30, 2009, 12:54 »

Зачем в классе client присутствуют  quitButton и buttonBox указатели и сами объекты в "динамике"? Почему бы не сделать эти объекты членами класса?  Мне кажется, что сделав кнопку quitButton членом класса client на работу программы не повлияет (если конечно не будет вызываться копирующий конструктор client).
Повлияет - рухнет на деструкторе, т.к. parent считает что все child'ы в куче и будет звать delete (btw: чем плохой ответ?)

ps И вообще на мой взгляд это кривой пример. Я бы вообще членом класса не делал бы кнопку
Верно, часто такие члены не нужны. Но без new и указателя не обойтись - parent только их и понимает, он не может (и не должен) хранить сами объекты

Интересно послушать, что он скажет
"Здесь вопросы задаю я" Улыбающийся
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #26 : Сентябрь 30, 2009, 12:58 »

Цитировать
Парент устанавливается. По этому поводу почитай про компоновку виджетов, посмотри исходные коы компоновщиков
Какой парент? Что ты называешь парнтом? QObject чтоли? Я называю парентом QWidget. Из асистанта
Цитировать
QWidget::QWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 )

Constructs a widget which is a child of parent, with widget flags set to f.

If parent is 0, the new widget becomes a window.

....
QWidget * QWidget::parentWidget () const

Returns the parent of this widget, or 0 if it does not have any parent widget.

Да даже если мы о разных парентах говорим, то к делу это не относится, т.к. при вызове конструктора на "стэке" и с помощью new с указанием одинаковых параметров  создаются одинаковые объекты с одинаковыми парентами.


Цитировать
Почитай про модели памяти - кучу и стек, почитай про размещение объектов в них. Подумай над разницей...
Я же говорю .... "Перечитал книжки, погуглил". Можешь в двух словах объяснить в чем разница? например в чем разница между 2-мя программами

int main()
{
 QLabel *p = new Label;
p->setText("1234");
delete p;
}
 
int main()
{
 QLabel p;
p.setText("1234");
}

имхо ни какой. Таже разница и членах класса. Или я не корректное сравнение привел? Или я что-то еще не понимаю???

Цитировать
Кстати еще разница в том, что операция выделения памяти в куче (через new) медленнее чем в стеке. Но это наверно видно будет только на больших списках.
Ну по мойму это вопрос философский. Некоторые берут это под сомнение в современных ос и на современном железе. Так же это зависит от реализации компилятора для конкретной платформы. Не факт что быстрее. К тому же, чтоб не развивать в этой ветке философию на тему, что быстрее работает, можно пренебречь данной разницей скорости выделения памяти на современных платформах для примеров из асистанта, т.к. это "спички" на которых не стоит экономить. Тем более в асистанте в примерах эти конструкторы вызываются как правило 1 раз за время работы программы (типа объекты для главнова окна как в Fortune Client Example)
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #27 : Сентябрь 30, 2009, 13:07 »

Цитировать
"Здесь вопросы задаю я" Улыбающийся
преподу +1  Смеющийся

Цитировать
Повлияет - рухнет на деструкторе, т.к. parent считает что все child'ы в куче и будет звать delete (btw: чем плохой ответ?)
Очевидно в качестве "ответа" преподу такой ответ прокатит. Мне тоже это пришло в голову и я испытал такой класс думая что, рухнет на деструкторе - не рухнуло. Может быть такое, что когда ребёнок удаляется, он сообщяет радителю, чтоб тот удалил этого ребенка из своего списка детей?
Записан
spirit
Гость
« Ответ #28 : Сентябрь 30, 2009, 13:11 »

наглядный пример
Код
C++ (Qt)
#include <QtGui>
#include "test.h"
 
Test::Test(QWidget *parent)
: QDialog(parent)
{
//QVBoxLayout *vbl = new QVBoxLayout(this);
//vbl->addWidget(&m_label);
 
m_label.setText("hello");
m_label.show();
}
 
Записан
spirit
Гость
« Ответ #29 : Сентябрь 30, 2009, 13:14 »

Зачем в классе client присутствуют  quitButton и buttonBox указатели и сами объекты в "динамике"? Почему бы не сделать эти объекты членами класса?  Мне кажется, что сделав кнопку quitButton членом класса client на работу программы не повлияет (если конечно не будет вызываться копирующий конструктор client).
Повлияет - рухнет на деструкторе, т.к. parent считает что все child'ы в куче и будет звать delete (btw: чем плохой ответ?)
это не приводит к крашу
Код
C++ (Qt)
Test::Test(QWidget *parent)
: QDialog(parent)
{
QVBoxLayout *vbl = new QVBoxLayout(this);
m_label.setText("hello");
vbl->addWidget(&m_label);
}
 
собственно как и этот
Код
C++ (Qt)
Test::Test(QWidget *parent)
: QDialog(parent)
{
m_label.setParent(this);
m_label.setText("hello");
}
 
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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