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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Философские вопросы по C++ и Qt  (Прочитано 3348 раз)
Pritcher
Гость
« : Январь 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 Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #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 » Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 22, 2016, 12:36 »

1) Да, если есть содержательный деструктор - его нужно писать всегда, кто знает как этот класс будет использоваться в дальнейшем

2) Нет, удаление должно быть в 1 месте, вот пусть только родитель и удаляет

3) Нет, хранение QBrush и QPen "подозрительно" (напр они могут быть как-то завязаны на текущий QPainter), лучше их создавать с нуля, пусть будет немного больше кода


А где же "философия"?  Улыбающийся
Записан
Pritcher
Гость
« Ответ #3 : Январь 22, 2016, 17:58 »

Igors, философия в том, что у каждого есть свое мнение на некоторые вопросы, которые я задал, и каждый по-разному их обосновывает. В конечном итоге, эта тема не для того, чтобы решить какую-то проблему, а лишь узнать, что думают по поводу заданных вопросов люди с опытом. По поводу тех членов класса. Мне кажется, что вызов пары set функций быстрее вызова конструктора, а памяти эти поля требовать много не будут.

В любом случае, спасибо за ответы, gil9red, Igors!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Январь 23, 2016, 08:27 »

По поводу тех членов класса. Мне кажется, что вызов пары set функций быстрее вызова конструктора, а памяти эти поля требовать много не будут.
Ваше решение вполне возможно, во всяком случае ошибкой его не назвать. Просто я лично так бы не делал именно из "философских" соображений. На мой взгляд это "не в духе" современного UI и/или Qt. Не то это место где надо скорость "выжимать"
Записан
Bepec
Гость
« Ответ #5 : Январь 23, 2016, 08:38 »

1 Нет смысла
2 Не нужно
3 Не стоит

пункты 1 именно в таких условиях не нужен. Но если вы планируете использовать классы в иных условиях, деструктор писать придётся.

3 пункт - доступ по указателю занимает настолько малое время, что оптимизировать его не имеет смысла.

Хотя сторонники преждевременной оптимизации вполне могут всегда писать деструктор и проверять удаление объектов.

PS в случае 1, то там вообще можно не париться с delete объектов, их контролем и прочим. Но опять таки - только в описанных условиях Улыбающийся
Записан
Pritcher
Гость
« Ответ #6 : Январь 23, 2016, 10:44 »

Bepec, спасибо за ответ!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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