Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Pritcher от Январь 22, 2016, 11:40



Название: [Решено] Философские вопросы по C++ и Qt
Отправлено: 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 не очень "толстые", но все же вопрос остается.


Название: Re: Философские вопросы по C++ и Qt
Отправлено: gil9red от Январь 22, 2016, 12:01
1. Нет. Можно просто создать объект на стеке, а не выделять его в куче:

main.cpp:

QApplication app(argc, argv);

MainWindow mw;
mw.show();

app.exec();

2. Нет, родитель сам удаляет детей.

3. Я бы не стал заморачиваться и устанавливал новые через методы set* родительского класса.


Название: Re: Философские вопросы по C++ и Qt
Отправлено: Igors от Январь 22, 2016, 12:36
1) Да, если есть содержательный деструктор - его нужно писать всегда, кто знает как этот класс будет использоваться в дальнейшем

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

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


А где же "философия"?  :)


Название: Re: Философские вопросы по C++ и Qt
Отправлено: Pritcher от Январь 22, 2016, 17:58
Igors, философия в том, что у каждого есть свое мнение на некоторые вопросы, которые я задал, и каждый по-разному их обосновывает. В конечном итоге, эта тема не для того, чтобы решить какую-то проблему, а лишь узнать, что думают по поводу заданных вопросов люди с опытом. По поводу тех членов класса. Мне кажется, что вызов пары set функций быстрее вызова конструктора, а памяти эти поля требовать много не будут.

В любом случае, спасибо за ответы, gil9red, Igors!


Название: Re: Философские вопросы по C++ и Qt
Отправлено: Igors от Январь 23, 2016, 08:27
По поводу тех членов класса. Мне кажется, что вызов пары set функций быстрее вызова конструктора, а памяти эти поля требовать много не будут.
Ваше решение вполне возможно, во всяком случае ошибкой его не назвать. Просто я лично так бы не делал именно из "философских" соображений. На мой взгляд это "не в духе" современного UI и/или Qt. Не то это место где надо скорость "выжимать"


Название: Re: Философские вопросы по C++ и Qt
Отправлено: Bepec от Январь 23, 2016, 08:38
1 Нет смысла
2 Не нужно
3 Не стоит

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

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

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

PS в случае 1, то там вообще можно не париться с delete объектов, их контролем и прочим. Но опять таки - только в описанных условиях :)


Название: Re: Философские вопросы по C++ и Qt
Отправлено: Pritcher от Январь 23, 2016, 10:44
Bepec, спасибо за ответ!