Название: [Решено] Философские вопросы по 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, спасибо за ответ!
|