Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Вопрос по созданию объектов 
V
    Опции темы
yngwie19
Дата 5.6.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Всем привет подскажите как лучше создавать новые виджеты
так
Код

QSpinBox splin

или
Код

QSplin *splin = new QSplib;

В книгах по-разному. Влияет ли это на что-нибудь?

PM MAIL   Вверх
mes
Дата 5.6.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(yngwie19 @  5.6.2009,  21:33 Найти цитируемый пост)
Влияет ли это на что-нибудь?

Да, влияет на время жизни. В первом случае объект погибнет при выходе за границы блока. 



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 5.6.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



yngwie19

А вопрос то с QT никак не связан smile

Цитата(mes @  5.6.2009,  23:28 Найти цитируемый пост)

Да, влияет на время жизни. В первом случае объект погибнет при выходе за границы блока. 

А во втором он будет жить пока его не удалят.
PM   Вверх
yngwie19
Дата 6.6.2009, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Это Я все понимаю. Как принято в Qt - создавать объект через указатель или нет.
PM MAIL   Вверх
W4FhLF
Дата 6.6.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 4
Всего: 121



Цитата(azesmcar @  5.6.2009,  23:32 Найти цитируемый пост)
А вопрос то с QT никак не связан


Очень даже связан.

Читать раздел assistant'a "Object Trees and Object Ownership"

Цитата(yngwie19 @  6.6.2009,  06:56 Найти цитируемый пост)
Как принято в Qt - создавать объект через указатель или нет.


Если объект имеет parent'a то такой объект должен быть создан в куче (через указатель тобишь). За уничтожением такого объекта будет следить система Qt, при уничтожении парента все наследники так же будут уничтожены. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mes
Дата 6.6.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(W4FhLF @  6.6.2009,  07:29 Найти цитируемый пост)
при уничтожении парента все наследники так же будут уничтожены. 

"Наследник" имеет некоторое другое значение. В данном случае подходит слово "ребенок".




--------------------
PM MAIL WWW   Вверх
W4FhLF
Дата 6.6.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 4
Всего: 121



mes, да child'ы в оригинальной терминологии. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
azesmcar
Дата 6.6.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(W4FhLF @  6.6.2009,  08:29 Найти цитируемый пост)

Очень даже связан.

Читать раздел assistant'a "Object Trees and Object Ownership"

Ну тогда был бы уместнее вопрос - как принято и как правильнее делать это в QT.
А так ощущение что автор спрашивает разницы между созданием обьектов в куче и в стеке.
PM   Вверх
yngwie19
Дата 6.6.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(yngwie19 @  6.6.2009,  06:56 Найти цитируемый пост)
Это Я все понимаю. Как принято в Qt 

Потом уточнил.
Значит лучше всегда создавать объекты в куче. Они что по размерам очень большие? в стеке места для всех не хватит?
PM MAIL   Вверх
azesmcar
Дата 6.6.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(yngwie19 @  6.6.2009,  11:08 Найти цитируемый пост)
Значит лучше всегда создавать объекты в куче. Они что по размерам очень большие? в стеке места для всех не хватит? 

Смотря какие обьекты. 
W4FhLF сказал какие конкретно обьекты надо создавать в куче. QString например в куче создавать не надо.
Тут речь не про то, поместится или нет. Просто QT построена на принципе Parent->Child и при удалении Parent-а все его потомки удаляются автоматически. Удаляются оператором delete. Проверьте что будет если написать
Код

class A{};
A t;
delete &t;

думаю вопросы отпадут smile

Это сообщение отредактировал(а) azesmcar - 6.6.2009, 11:35
PM   Вверх
mes
Дата 6.6.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(yngwie19 @  6.6.2009,  10:08 Найти цитируемый пост)
Значит лучше всегда создавать объекты в куче. Они что по размерам очень большие? в стеке места для всех не хватит? 

не всегда и по большей степени не из за размера. Главное управление временем жизни.

если поймете как связаны эти две нижеприведенные цитаты, поймете и в чем дело 

Цитата(W4FhLF @  6.6.2009,  07:29 Найти цитируемый пост)
Если объект имеет parent'a то такой объект должен быть создан в куче (через указатель тобишь). За уничтожением такого объекта будет следить система Qt, при уничтожении парента все наследники так же будут уничтожены. 

Цитата(azesmcar @  6.6.2009,  10:23 Найти цитируемый пост)
Проверьте что будет если написать
Код

class A{};
A t;
delete &t;




Это сообщение отредактировал(а) mes - 6.6.2009, 12:58


--------------------
PM MAIL WWW   Вверх
chaos
Дата 6.6.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(W4FhLF @ 6.6.2009,  05:29)
Если объект имеет parent'a то такой объект должен быть создан в куче (через указатель тобишь). За уничтожением такого объекта будет следить система Qt, при уничтожении парента все наследники так же будут уничтожены.

все правельно понял: "чилда" можно удалить вручную(delete)?

просто столкнулся с итуацией: есть MainWindow, упрощая задачу, раз в минуту необходимо открытвать диалоговое окно на 10 секунд и закрывать его, те оно само закрывается по своему внутреннему таймеру.
так вот если приложение работает долго, а оно и должно долго работать, то видно как память "утекает".
Вопрос: можно ли в диалоговом окне по закрытию делать delete this?
Если нет, то как быть тогда?


Заранее благодарен!

Добавлено через 1 минуту и 2 секунды
ЗЫ модальное диалоговое окно, те необходимо в данном случае указать парента в качестве MainWindow
PM WWW   Вверх
W4FhLF
Дата 7.6.2009, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 4
Всего: 121



chaos, а зачем для каждого раза создавать новый виджет? Почему нельзя показывать один и тот же, но с изменениями? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
chaos
Дата 7.6.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



W4FhLF, вообще можно.
больше нитересует вопрос выше.


ЗЫ переделаю на создание одного виджета smile
PM WWW   Вверх
chaos
Дата 8.6.2009, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



так что на счет удаления объекта в ручную?
PM WWW   Вверх
Любитель
Дата 8.6.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Удалять вручную можно. Деструктор QObject вначале проверит своего парента и, если надо, отметится, что "я больше не твой чайлд". Но причём тут delete this? Это потенциально опасная конструкция и.. вообщем плохая практика. В любом случае же, я думаю, есть какая-то обёртка вызывающая диалог (передающая параметры для инициализации, возвращающая результат)? Вот в ней и удалять. Да и вообще, если диалог вызывается через exec (ну и вся обработка в рамках одной функции), зачем нужно создавать объект в куче (смотрим соседнюю тему)?


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 9.6.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 7
Всего: 250



Цитата(chaos @  8.6.2009,  06:33 Найти цитируемый пост)
так что на счет удаления объекта в ручную? 

В принципе  Любитель все объяснил. Добавлю лишь кусок псевдокода показывающий поведение Окна:
Код

class Widget 
{
       Widget (Widget* parent) : m_parent(parent)
                               {
                                    if (m_parent) m_parent->m_childs.Add(this);
                               }
       ~Widget () {
                     while (Widget * w = m_childs.begin()) w->Close();
                     if (m_parent) m_parent->m_childs.Remove(this);
                  }

    private:
        Widget       * m_parent;
        WidgetArray    m_childs;

};



--------------------
PM MAIL WWW   Вверх
chaos
Дата 19.6.2009, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Любитель, 
mes, 
Спасибо!
PM WWW   Вверх
pan2004
Дата 21.6.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



chaos, для таких случаев умные тролли придумали метод deleteLater() (можно вызывать из объекта вместо delete this;)


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.