Russian Qt Forum
Ноябрь 27, 2024, 02:16
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
[Решено] Философские вопросы по C++ и Qt
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [Решено] Философские вопросы по C++ и Qt (Прочитано 3367 раз)
Pritcher
Гость
[Решено] Философские вопросы по C++ и Qt
«
:
Январь 22, 2016, 11:40 »
Приветствую!
За то немногое время, что я пишу на С++ и Qt в частности, возникло несколько вопросов, на которые явных ответов я не нашёл. На этом форуме немало человеком с опытом, потому прошу разрешить мои терзания.
1. Есть ли смысл писать деструктор для класса, если его объект создается и не удаляется во время работы программы? Например, приложение с GUI, главное окно - наследник QMainWidget.
2. Положим, есть потомок от QWidget, у него есть какие-то поля, например, несколько QLabel*, которым при создании указывается в качестве родителя объект данного класс. В доках сказано, что если объявить родителя для объекта в иерархии Qt-классов, то его удалением займется класс-родитель. Нужно ли явно в деструкторе данного класса удалять объекты QLabel?
3. Стоит ли хранить в классе-потомке временные объекты, которые используются относительно часто, но которые при этом есть в классе-родителе, однако, доступ к этим объектам есть только через функции класса-родителя? Например, я создаю потомка от QGraphicsRectItem, храню как члены-класса QPen и QBrush, их параметры относительно часто (положим, пару раз в секунду) меняются. В классе родителе QAbstractGraphicsShapeItem есть методы pen() и brush(), но они возвращают копии, а значит внутри методов, где изменяются параметры QPen и QBrush мне нужно при каждом вызове создавать новый объект, менять его конфигурации, а потом устанавливать методом setPen() и setBrush() соответственно, или же можно дополнительно хранить QPen и QBrush, как я и делаю. Целесообразно ли тратить дополнительную память на хранение этих временных объектов в качестве членов класса?
Да, это лишняя оптимизация, поскольку QPen и QBrush не очень "толстые", но все же вопрос остается.
«
Последнее редактирование: Январь 25, 2016, 06:17 от Pritcher
»
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Философские вопросы по C++ и Qt
«
Ответ #1 :
Январь 22, 2016, 12:01 »
1. Нет. Можно просто создать объект на стеке, а не выделять его в куче:
main.cpp:
QApplication app(argc, argv);
MainWindow mw;
mw.show();
app.exec();
2. Нет, родитель сам удаляет детей.
3. Я бы не стал заморачиваться и устанавливал новые через методы set* родительского класса.
«
Последнее редактирование: Январь 22, 2016, 12:04 от gil9red
»
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Философские вопросы по C++ и Qt
«
Ответ #2 :
Январь 22, 2016, 12:36 »
1) Да, если есть содержательный деструктор - его нужно писать всегда, кто знает как этот класс будет использоваться в дальнейшем
2) Нет, удаление должно быть в 1 месте, вот пусть только родитель и удаляет
3) Нет, хранение QBrush и QPen "подозрительно" (напр они могут быть как-то завязаны на текущий QPainter), лучше их создавать с нуля, пусть будет немного больше кода
А где же "философия"?
Записан
Pritcher
Гость
Re: Философские вопросы по C++ и Qt
«
Ответ #3 :
Январь 22, 2016, 17:58 »
Igors, философия в том, что у каждого есть свое мнение на некоторые вопросы, которые я задал, и каждый по-разному их обосновывает. В конечном итоге, эта тема не для того, чтобы решить какую-то проблему, а лишь узнать, что думают по поводу заданных вопросов люди с опытом. По поводу тех членов класса. Мне кажется, что вызов пары set функций быстрее вызова конструктора, а памяти эти поля требовать много не будут.
В любом случае, спасибо за ответы, gil9red, Igors!
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Философские вопросы по C++ и Qt
«
Ответ #4 :
Январь 23, 2016, 08:27 »
Цитата: Pritcher от Январь 22, 2016, 17:58
По поводу тех членов класса. Мне кажется, что вызов пары set функций быстрее вызова конструктора, а памяти эти поля требовать много не будут.
Ваше решение вполне возможно, во всяком случае ошибкой его не назвать. Просто я лично так бы не делал именно из "философских" соображений. На мой взгляд это "не в духе" современного UI и/или Qt. Не то это место где надо скорость "выжимать"
Записан
Bepec
Гость
Re: Философские вопросы по C++ и Qt
«
Ответ #5 :
Январь 23, 2016, 08:38 »
1 Нет смысла
2 Не нужно
3 Не стоит
пункты 1 именно в таких условиях не нужен. Но если вы планируете использовать классы в иных условиях, деструктор писать придётся.
3 пункт - доступ по указателю занимает настолько малое время, что оптимизировать его не имеет смысла.
Хотя сторонники преждевременной оптимизации вполне могут всегда писать деструктор и проверять удаление объектов.
PS в случае 1, то там вообще можно не париться с delete объектов, их контролем и прочим. Но опять таки - только в описанных условиях
Записан
Pritcher
Гость
Re: Философские вопросы по C++ и Qt
«
Ответ #6 :
Январь 23, 2016, 10:44 »
Bepec, спасибо за ответ!
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...