Russian Qt Forum

Qt => Общие вопросы => Тема начата: k06a от Сентябрь 28, 2009, 07:29



Название: Почему все объекты qt в динамической памяти?
Отправлено: k06a от Сентябрь 28, 2009, 07:29
Во всех примерах в документации поля классов представляют из себя указатели на объекты, а не сами объекты. Вопрос: почему? Ответ нужен не мне, а преподавателю.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Rcus от Сентябрь 28, 2009, 08:15
http://www.prog.org.ru/topic_10166_0.html


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: k06a от Сентябрь 28, 2009, 08:35
Мне нужна более весомая причина, желательно от самих разработчиков библиотеки.
Иначе хорошему другу придётся "испоганить" свой код ...


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: BlackTass от Сентябрь 28, 2009, 08:47
Ну вообще это считается негласным хорошим тоном использовать указатели в подобных ситуациях (а при условии наследования иначе просто никак). Может вы тогда полностью расскажете в чем дело? а то сначала был просто вопрос, теперь вот еще товарищ с кодом всплыл)

P.S. И вообще, у нас что в России есть вузы где учат куте? эх, почему я  в свое время учился не там(


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Rcus от Сентябрь 28, 2009, 09:18
Мне нужна более весомая причина, желательно от самих разработчиков библиотеки.
Иначе хорошему другу придётся "испоганить" свой код ...
Вам уже назвали причину, какая для вас будет достаточно весомой? Сами разработчики используют еще более жесткие ограничения на использование данных-членов. Погуглите проблемы бинарной совместимости в C++ для профилактики.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: k06a от Сентябрь 28, 2009, 09:26
Друг пишет прогу преподавателю (Долгосрочка такая).
Преподаватель спросил почему там стоят указатели, велел сделать их членами.

Друг пытался аргументировать сови действия тем, что в все примеры в документации сделаны именно так.

"Раньше в документации писали - Земля плоская ..." - ответ преподавателя)))

P.S. Без веского аргумента придется изуродовать код.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: BRE от Сентябрь 28, 2009, 09:36
Друг пишет прогу преподавателю (Долгосрочка такая).
Преподаватель спросил почему там стоят указатели, велел сделать их членами.

Друг пытался аргументировать сови действия тем, что в все примеры в документации сделаны именно так.

"Раньше в документации писали - Земля плоская ..." - ответ преподавателя)))

P.S. Без веского аргумента придется изуродовать код.
Другу нужно сохранить исходники, в том виде как сейчас и начать их править, как сказал преподаватель. Думаю в скором времени он получит много аргументов... А пока преподаватель будет компилировать "улучшенную" версию, у товарища будет достаточно времени попить пивка.  :)

2 BlackTass. Ты до сих пор хотел бы учиться в таком вузе (точнее у такого преподавателя)?  ;)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: ритт от Сентябрь 28, 2009, 10:59
это надо в раздел "юмор" :)

а сейчас пишут, что Земля, мол, имеет форму шара, сплюснутого у полюсов. интересно, как он проаргументирует, истинность данного заявления? похоже, он всё ещё придерживается теории плоской Земли :)
надеюсь, сий преподаватель читает не программирование...

зы. сделай ему класс с парой сотен объектов, размещённых в стэке, в качестве членов...да по-тяжелее, по-тяжелее :)
пущай расскажет почему стало так херово :)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: BlackTass от Сентябрь 28, 2009, 11:07
зы. сделай ему класс с парой сотен объектов, размещённых в стэке, в качестве членов...да по-тяжелее, по-тяжелее :)
пущай расскажет почему стало так херово :)

А еще лучше это в дочернем потоке делать, где стек поменьше

2 BRE. Нет спасибо, я понял свою ошибку) в моем вузе таких преподов не было)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: baka от Сентябрь 28, 2009, 11:25
Да нормальный препод!
Скорей всего это просто провокация с его стороны чтоб побудить студента к исканиям причин, студент под таким "гнетом" лучше разберется в вопросе.

P.S.
Мне бы такого препода, а то у нас тупо Бэйсик отдиктует и уйдет.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Igors от Сентябрь 28, 2009, 13:09
Во всех примерах в документации поля классов представляют из себя указатели на объекты, а не сами объекты. Вопрос: почему? Ответ нужен не мне, а преподавателю.
Может не стОит переоценивать вопрос? Ответьте просто: указатель более гибок и предоставляет больше возможностей. Например

Код:
class CExample1 {
...
  QWidget * theCenter;
};

class CExample2 {
...
  QWidget theCenter;
};
В первом случае можно использовать любых потомков QWidget, менять их на ходу и т.п.
А во втором случае никаких этих возможностей нет

Присоединяюсь к добрым словам о Вашем преподавателе



Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: whirlwind от Сентябрь 28, 2009, 13:26
Цитировать
QObject has neither a copy constructor nor an assignment operator. This is by design. Actually, they are declared, but in a private section with the macro Q_DISABLE_COPY(). In fact, all Qt classes derived from QObject (direct or indirect) use this macro to declare their copy constructor and assignment operator to be private. The reasoning is found in the discussion on Identity vs Value on the Qt Object Model page.

The main consequence is that you should use pointers to QObject (or to your QObject subclass) where you might otherwise be tempted to use your QObject subclass as a value. For example, without a copy constructor, you can't use a subclass of QObject as the value to be stored in one of the container classes. You must store pointers.
вдруг поможет


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: ритт от Сентябрь 28, 2009, 13:37
Да нормальный препод!
Скорей всего это просто провокация с его стороны чтоб побудить студента к исканиям причин, студент под таким "гнетом" лучше разберется в вопросе.

кстати, да - это бы бы наилучший вариант - если студент перепишет в худшую сторону лишь потому, что "так сказал препод", то учился он зря; иначе он найдёт способ "убедить" препода в его неправоте.
другие варианты не в пользу препода))


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: break от Сентябрь 28, 2009, 23:54
Все преподаватели программирования бараны и недопрограммисты (видел десяток таких), потому что грамотные программисты работают там где платят не учительскую зарплату, а вашему другу лучше сделать так как сказал этот повелитель судеб и не пытаться переубеждать его, иначе не сдаст свою курсовую.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: juvf от Сентябрь 29, 2009, 06:18
Да нормальный препод!
Скорей всего это просто провокация с его стороны чтоб побудить студента к исканиям причин, студент под таким "гнетом" лучше разберется в вопросе.
+1

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


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Steven_Orko от Сентябрь 29, 2009, 09:45
Да нормальный препод!
Скорей всего это просто провокация с его стороны чтоб побудить студента к исканиям причин, студент под таким "гнетом" лучше разберется в вопросе.
+1

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


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Igors от Сентябрь 29, 2009, 12:34
Я удивлен (хотя с преподаванием никак не связан). Преподаватель задает абсолютно НОРМАЛЬНЫЙ, несложный, общий вопрос на который легко найти 3-4 варианта ответа (скорее всего устроит любой). Просто пусть друг ответит (прочитав эту тему) - да и дело с концом :)


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

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

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


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: juvf от Сентябрь 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 "добросовестный".

Я бы так ответил преподу: "Абсолютно нет тик какой разницы в динамике, или в статике.Поэтому выбрал динамику. Если Вы требуете сделать статические члены - то обоснуйте  -  во имя какой великой цели необходимо переделывать весь код?" ну или что-то того. Интересно послушать, что он скажет


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: spirit от Сентябрь 30, 2009, 11:03
а ты пропробуй создать виджет без парента, что получишь?
к тому же в ашник придется подключать ашники других объектов,
а это уменьшит скорость компиляции.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: juvf от Сентябрь 30, 2009, 11:31
Цитировать
а ты пропробуй создать виджет без парента, что получишь?
получу виджет без парента. Практически везде в примерах ассистента создаются виджеты без парента, например в томже client.cpp
Код:
quitButton = new QPushButton(tr("Quit"));
Или я тебя не понял ???


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: spirit от Сентябрь 30, 2009, 11:38
он создастся в отдельном окне, если конечно не делать явный репарент или юзать компоновщики.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: pastor от Сентябрь 30, 2009, 11:39
Я бы так ответил преподу: "Абсолютно нет тик какой разницы в динамике, или в статике."

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

2) Про копирующий конструктор уже упомянули


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: pastor от Сентябрь 30, 2009, 11:43
получу виджет без парента. Практически везде в примерах ассистента создаются виджеты без парента, например в томже client.cpp

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


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: SABROG от Сентябрь 30, 2009, 12:00
Кстати еще разница в том, что операция выделения памяти в куче (через new) медленнее чем в стеке. Но это наверно видно будет только на больших списках.


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

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

Интересно послушать, что он скажет
"Здесь вопросы задаю я" :)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: juvf от Сентябрь 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)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: juvf от Сентябрь 30, 2009, 13:07
Цитировать
"Здесь вопросы задаю я" Улыбающийся
преподу +1  ;D

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


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: spirit от Сентябрь 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();
}
 


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: spirit от Сентябрь 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");
}
 


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: pastor от Сентябрь 30, 2009, 13:40
Я же говорю .... "Перечитал книжки, погуглил". Можешь в двух словах объяснить в чем разница? например в чем разница между 2-мя программами

Очень плохо гуглил ))

Heap vs. Stack (http://www.computing.net/answers/programming/heap-vs-stack/11004.html)
The stack and the heap  (http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/)
Stack vs Heap Allocation (http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: f0x от Сентябрь 30, 2009, 13:58
Повлияет - рухнет на деструкторе, т.к. parent считает что все child'ы в куче и будет звать delete (btw: чем плохой ответ?)
Тем что это абсолютная ложь и если препод не чайник может запросто глянуть исходники Qt и послать вас на пересдачу.

QObject в деструкторе лезет к родителю и удаляет себя из него.

Поэтому с точки зрения работоспособности - создание в куче или в стеке абслолютно идентичны.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Igors от Сентябрь 30, 2009, 15:11
Повлияет - рухнет на деструкторе, т.к. parent считает что все child'ы в куче и будет звать delete (btw: чем плохой ответ?)
Тем что это абсолютная ложь ...
Аккуратнее пожалуйста. Грубость никогда не убеждает да и форум не украшает. Давайте не горячиться а разберемся спокойно. Пример, который привел spirit действительно будет работать корректно.

Код:
Test::Test(QWidget *parent)
: QDialog(parent)
{
m_label.setParent(this);
m_label.setText("hello");
}
Выполняется удаление Test. Сначала вызовется деструктор Test. Он позовет деструктор m_label, значит m_label будет удален из children'ов Test и второй раз m_label удаляться не будет. Все хорошо.

А теперь чуть-чуть усложним пример

Код:
#include <QtGui>
#include <qDebug>

class MyLabel : public QLabel {
public:
MyLabel( QWidget * parent = 0 ) : QLabel(parent) {}

    virtual ~MyLabel( void )  
{
qDebug() << "destruct MyLabel";
}
};

class MyFrame : public QFrame {
public:
MyFrame( QWidget * parent = 0 ) : QFrame(parent) {}

    virtual ~MyFrame( void )  
{
qDebug() << "destruct MyFrame";
}
};

class MyDialog : public QDialog {
public:
MyDialog( QWidget * parent = 0 ) : QDialog(parent)
{
mFrame.setParent(this);
mLabel.setParent(&mFrame);
}

// data
MyLabel mLabel;
MyFrame mFrame;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

MyDialog dlg;
return 0;
}
А вот тут уже рассыпалось - деструктор mFrame вызывается первым и прется удалить mLabel. Конечно, если поменять местами члены mFrame и mLabel - все заработает. Но хотите ли Вы так программировать? :)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: BRE от Сентябрь 30, 2009, 16:23
Пример, который привел BRE действительно будет работать корректно.
Какой пример, где приводил?  :)  ;)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Igors от Сентябрь 30, 2009, 16:32
Какой пример, где приводил?  :)  ;)
Ивините, описАлся и исправил, этот пример привел spirit


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: f0x от Сентябрь 30, 2009, 16:43
Аккуратнее пожалуйста. Грубость никогда не убеждает да и форум не украшает. Давайте не горячиться а разберемся спокойно.
Приношу извинения  ;D

Конечно, если поменять местами члены mFrame и mLabel - все заработает. Но...

... и то это будет работать до тех пор пока мы не захотим использовать взаимозависимые классы...
Т.е создавая наследников QObject в стеке мы не получаем никакого выигрыша, а лишь проблемы на перспективу.
В таком случае возникает вопрос, а есть ли выгода от создания стековых диалогов в методах классов или лучше использовать
Код
C++ (Qt)
MyClass::MyMethod()
{
   Dialog * d = new Dialog()
...
...
  delete d;
}
 
?


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: spirit от Сентябрь 30, 2009, 16:46
имхо в таком случае лучше создать диалог в стеке и заюзать QDialog::exec.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Igors от Сентябрь 30, 2009, 17:04
В таком случае возникает вопрос, а есть ли выгода от создания стековых диалогов в методах классов или лучше использовать
Код
C++ (Qt)
MyClass::MyMethod()
{
   Dialog * d = new Dialog()
...
...
  delete d;
}
 
?
По-моему это дело вкуса. Я лично с удовольствием использую локальные объекты при первой возможности - люблю выскакивать из функций return'ом (хоть это и не по классике) и в этом случае деструктор сам все сделает, нечего беспокоиться о delete. "Расходы" (мол, больше памяти на стеке или "стек быстрее") здесь никто не учитывал даже на процессорах с частотой 9Mz, а сегодня уж и говорить нечего :)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: lit-uriy от Октябрь 01, 2009, 06:50
вообще троли давали объяснение почему они используют указатели. И объяснение достаточно развёрнутое.
Если вспомню где это было, дам ссылку.
В двух словах: безопаснее работать с указателями, т.к. применение некого API выглядит более интуитивным (маленький пример есть здесь (http://www.wiki.crossplatform.ru/index.php/Designing_Qt-Style_C%2B%2B_APIs#.D0.A3.D0.BA.D0.B0.D0.B7.D0.B0.D1.82.D0.B5.D0.BB.D0.B8_.D0.B8.D0.BB.D0.B8_.D1.81.D1.81.D1.8B.D0.BB.D0.BA.D0.B8.3F))


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: juvf от Октябрь 01, 2009, 09:27
Цитировать
Но хотите ли Вы так программировать? Улыбающийся
Конечно нет. Зачем так извращатся и создавать такие классы?  :) Igors, твой пример, ну очень уш извращенный. На практике такого не встречал. Зачем делать mLabel членом MyDialog, если его родителем будет не MyDialog? Мне кажется, что этот пример написан на тему "Я могу уронить программу без использования указателей". При желании можно любую программу уронить, и с указателями, и с локальными объектами. Возможно, в жизни где-то и необходим подобный код, но тогда нужно учесть особенности Qt. А вопрос, касательно использования членов-указателей вместо членов-объектов у тролей, остается открытым.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Igors от Октябрь 01, 2009, 12:25
Цитировать
Но хотите ли Вы так программировать? Улыбающийся
Конечно нет. Зачем так извращатся и создавать такие классы?  :) Igors, твой пример, ну очень уш извращенный. На практике такого не встречал. Зачем делать mLabel членом MyDialog, если его родителем будет не MyDialog? Мне кажется, что этот пример написан на тему "Я могу уронить программу без использования указателей". При желании можно любую программу уронить, и с указателями, и с локальными объектами. Возможно, в жизни где-то и необходим подобный код, но тогда нужно учесть особенности Qt. А вопрос, касательно использования членов-указателей вместо членов-объектов у тролей, остается открытым.
Конечно, пример извращенный :) Но ведь я буквально следовал правилу: использовать члены-объекты вместо членов-указателей - и падает оно само, я его не ронял :)  А вот с использованием указателей надо еще постараться чтобы уронить. Делая объект членом класса, Вы тем самым заряжаете механизм его удаления в деструкторе. Это неизбежно будет заклинивать с Qt механизмом "parent удаляет своих children". Зачем же искать приключений на свою "голову" и доказывать что "можно и с членами-объектами написать"?

Конечно, из этого не следует что член-объект есть "плохо", например в классах для конкретных инженерных расчетов именно члены-объекты доминируют, незачем там указатели городить. Но в Qt UI (да и в любом UI) указатель гибче/лучше.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: SASA от Октябрь 02, 2009, 17:39
Все преподаватели программирования бараны и недопрограммисты (видел десяток таких), потому что грамотные программисты работают там где платят не учительскую зарплату, а вашему другу лучше сделать так как сказал этот повелитель судеб и не пытаться переубеждать его, иначе не сдаст свою курсовую.
Попрошу не оскорблять. >:( >:( >:( А лучше извиниться!
Я преподаю в универе и у меня есть работа за которую "платят не учительскую зарплату". Плюс ко всему я считаю себя неплохим программистом.
З.Ы. Извините за офтоп, но когда тебя называют бараном и недопрограммистом, это задевает.


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: Vexator от Октябрь 05, 2009, 09:55
препод преподу рознь, и в вузах встречаются и очень грамотные программеры, причем большинство из них работают по совмещению :)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: SABROG от Октябрь 05, 2009, 11:33
З.Ы. Извините за офтоп, но когда тебя называют бараном и недопрограммистом, это задевает.

Поздравляю с Всемирным Днём Учителя!


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: SASA от Октябрь 05, 2009, 18:38
Поздравляю с Всемирным Днём Учителя!
Спасибо.

З.Ы. Извините за офтоп, но когда тебя поздравляют, это приятно. :) :) :)


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: thechicho от Октябрь 13, 2011, 20:09
З.Ы. Извините за офтоп, но когда тебя называют бараном и недопрограммистом, это задевает.
З.Ы. Извините за офтоп, но когда тебя поздравляют, это приятно. :) :) :)

З.Ы. Извините за офтоп, но когда пишут такую х, это радует :D


Название: Re: Почему все объекты qt в динамической памяти?
Отправлено: lesav от Октябрь 21, 2011, 13:30
А топик очень интересный, я его прочитал с удовольствием.

З.Ы. Извините за офтоп, но когда пишут такую х, это радует :D
Просто люди бывают разные, есть учтивые(читай вежливые), для которых важно сказать слова спасибо/пожалуйста/извините. А бывают и такие (http://www.youtube.com/watch?v=h_g45an7nko)