Re[9]: Про указатели в Qt - нравится ли вам?
От: so5team https://stiffstream.com
Дата: 06.10.23 05:12
Оценка: +2
Здравствуйте, Alekzander, Вы писали:

S>>Если вы проведете опрос среди большого количества C++ разработчиков о том, хотят ли они видеть в стандартной библиотеке C++ один большой класс для работы со строками по типу QString, то вы удивитесь тому, насколько много скажет "нет".


A>Ага, знаем. Нет спроса — нет привоза.


А как-то вменяемо свою точку зрения озвучить можно или мозгов хватает только на эмоции в стиле "все, что мне не нравится -- говно"?

Тот же QString выглядит как god object, в который впихнули все что могли, потому что кому-то это может понадобиться. Вот, скажем, QString::arg, зачем он именно в классе строки, если такую функциональность удобнее было бы иметь в той части библиотеки, которая отвечает за форматирование (по типу fmt::format, std::format, Boost::format), чтобы результат форматирования можно было хоть в строку, хоть в ostream, хоть в memory buffer отправлять.

Да, можно понять ленивые задницы пользователей, которые хотят из коробки все и сразу. Но все равно непонятно, зачем иметь leftJustified, setNum, simplified или localeAwareCompare прямо в классе "строка" и почему нельзя все это вынести в свободные функции? С этой точки зрения QString хорошо спроектированным классом не выглядит от слова совсем. И включать такое в стандартную библиотеку языка, на котором пишется далеко не только GUI, еще более ужасная идея, чем иметь там std::basic_string.
Re[4]: Про указатели в Qt - нравится ли вам?
От: Skorodum Россия  
Дата: 06.10.23 08:44
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>До выполнения тела функции doSomething2 дело не доходит и результат new утекает.

doSomething2 тут не при чем. После этого выражения

new QLabel(this, "1")

объект QLabel уже в списке дочерних у объекта this и будет удален при удалении this (что и произойдет при раскручивании стэка при выбросе исключения).
Re[10]: Про указатели в Qt - нравится ли вам?
От: Alekzander  
Дата: 06.10.23 09:16
Оценка:
Здравствуйте, so5team, Вы писали:

S>>>Если вы проведете опрос среди большого количества C++ разработчиков о том, хотят ли они видеть в стандартной библиотеке C++ один большой класс для работы со строками по типу QString, то вы удивитесь тому, насколько много скажет "нет".


A>>Ага, знаем. Нет спроса — нет привоза.


S>А как-то вменяемо свою точку зрения озвучить можно или мозгов хватает только на эмоции в стиле "все, что мне не нравится -- говно"?


А ты думаешь, много желания с тобой, таким вежливым, вступать в долгие разговоры? Ладно, объясню, но только один раз. И спорить не буду.

Чтобы планировать эксперименты, нужно уметь хотя бы немного пользоваться головой. Дурак, он ведь как: проведёт опрос среди пользователей Интернета, и опрос покажет, что 100% опрошенных пользуются Интернетом. И ничего его не смутит.

В данном случае, опрос уже недавно был тут проведён
Автор: dmitry_npi
Дата: 16.08.23
. Хотя автор пишет, что он никаких опросов проводить не собирался, а просто у него пригорело (хорошо его понимаю). Из 16 опрошенных 14 поддержали автора в том, что C++ упорот, и он не зря ушёл в C#. Вот это и есть честный ответ, чего хотят разработчики. А если возьмём и проведём опрос среди "большого количества C++ разработчиков" (то есть, в данном случае, тех двоих, которые остались на C++), он, конечно же, покажет, что C++ прекрасен, стандартная библиотека восхитительна, а менять ничего не надо. Такие люди остались, что на прикладной код (для написания которого гораздо лучше подходит QString) им наплевать, им подавай извращения
Автор: Sm0ke
Дата: 28.01.22
, за которые в нормальных местах просто увольняют.

При этом, заметь, что RSDN это место, где тусуют мамонты. Очень приверженные старым привычкам. И даже если *тут* счёт 14:2, то представь себе, что говорят там, где тусит молодёжь (я это знаю, потому что бываю).

Короче, ограничься лучше профильным форумом, где на твой сиплюсплюсный ум есть спрос. Социология и опросы просто не твоё.
Re[11]: Про указатели в Qt - нравится ли вам?
От: so5team https://stiffstream.com
Дата: 06.10.23 09:40
Оценка: +2
Здравствуйте, Alekzander, Вы писали:

A>Дурак, он ведь как: проведёт опрос среди пользователей Интернета, и опрос покажет, что 100% опрошенных пользуются Интернетом. И ничего его не смутит.


A>Из 16 опрошенных 14 поддержали автора в том, что C++ упорот, и он не зря ушёл в C#.


A>Социология и опросы просто не твоё.


Вообще-то я вел речь о чисто технической стороне дела. К QString есть претензии, которые станут фатальными, если попытаться добавить такой класс в стандарт. Вы же решили перевести беседу в сторону "сам дурак". Ну OK. Мне тут даже ничего добавлять не придется.
Re[5]: Про указатели в Qt - нравится ли вам?
От: so5team https://stiffstream.com
Дата: 06.10.23 09:44
Оценка:
Здравствуйте, Skorodum, Вы писали:

Q>>До выполнения тела функции doSomething2 дело не доходит и результат new утекает.

S>doSomething2 тут не при чем. После этого выражения
S>

S>new QLabel(this, "1")

S>объект QLabel уже в списке дочерних у объекта this и будет удален при удалении this (что и произойдет при раскручивании стэка при выбросе исключения).

Подождите, подождите. Вот у нас есть выражение:
f(new A(), g());

Это выражение может вычисляться следующим образом:

* выполняется new A() и полученный указатель компилятором где-то сохраняется;
* выполняется вызов g() и из g() вылетает исключение.

Вы хотите сказать, что в этом случае компилятор выполнит откат операции new A()?
Re[6]: Про указатели в Qt - нравится ли вам?
От: night beast СССР  
Дата: 06.10.23 09:53
Оценка:
Здравствуйте, so5team, Вы писали:

S>Вы хотите сказать, что в этом случае компилятор выполнит откат операции new A()?


откат -- нет. передача владения произойдет в конструкторе А
поэтому А будет жить пока не умрет родитель (this)
но у этого объекта можно будет сменить родителя в doSomething
да, не очень очевидно, но без утечек.
Re[7]: Про указатели в Qt - нравится ли вам?
От: so5team https://stiffstream.com
Дата: 06.10.23 10:04
Оценка:
Здравствуйте, night beast, Вы писали:

S>>Вы хотите сказать, что в этом случае компилятор выполнит откат операции new A()?


NB>откат -- нет. передача владения произойдет в конструкторе А

NB>поэтому А будет жить пока не умрет родитель (this)
NB>но у этого объекта можно будет сменить родителя в doSomething
NB>да, не очень очевидно, но без утечек.

Ну т.е. если у нас this -- это какой-то QObject, то конструкция new QLabel(this, "1") создаст QLabel и добавит его в список дочерних для this. При этом указатель на QLabel потеряется, т.к. его передача куда-то не состоится из-за исключения.

И этот QLabel будет жить до тех пор пока живет this.
Но this не обязательно будет удален в результате исключения, как это было сказано: "будет удален при удалении this (что и произойдет при раскручивании стэка при выбросе исключения)"

Т.е. если this переживет исключение, то QLabel останется существовать и когда-то умрет. Но до тех пор будет "фантомом", т.к. к нему никто, по сути, доступа не будет иметь и ничего полезного с ним не сделает.
Re[8]: Про указатели в Qt - нравится ли вам?
От: night beast СССР  
Дата: 06.10.23 10:16
Оценка:
Здравствуйте, so5team, Вы писали:

S>Ну т.е. если у нас this -- это какой-то QObject, то конструкция new QLabel(this, "1") создаст QLabel и добавит его в список дочерних для this. При этом указатель на QLabel потеряется, т.к. его передача куда-то не состоится из-за исключения.


не совсем. насколько помню, раньше родителем для виджета произвольный QObject быть не мог, только QWidget.

S>И этот QLabel будет жить до тех пор пока живет this.

S>Но this не обязательно будет удален в результате исключения, как это было сказано: "будет удален при удалении this (что и произойдет при раскручивании стэка при выбросе исключения)"

если предположить что это все происходит в конструкторе, то будет )

S>Т.е. если this переживет исключение, то QLabel останется существовать и когда-то умрет. Но до тех пор будет "фантомом", т.к. к нему никто, по сути, доступа не будет иметь и ничего полезного с ним не сделает.


доступ к нему получить можно, но суть приблизительно такая, да
поэтому в качестве родителя надо подсовывать не произвольный QObject, а что-то более подходящее
Отредактировано 06.10.2023 10:23 night beast . Предыдущая версия .
Re[9]: Про указатели в Qt - нравится ли вам?
От: so5team https://stiffstream.com
Дата: 06.10.23 10:22
Оценка:
Здравствуйте, night beast, Вы писали:

NB>не совсем. насколько помню, раньше родителем для виджета произвольный QObject быть не мог, только QWidget.


Ну да, в конструктор QLabel можно отдать только QWidget в качестве родителя.

NB>доступ к нему получить можно, но суть приблизительно такая, да


Ок, теперь картинка соответствует тому, что было у меня в памяти.
Re[10]: Про указатели в Qt - нравится ли вам?
От: night beast СССР  
Дата: 06.10.23 10:25
Оценка:
Здравствуйте, so5team, Вы писали:

NB>>доступ к нему получить можно, но суть приблизительно такая, да

S>Ок, теперь картинка соответствует тому, что было у меня в памяти.

там чуть подредактировал
если все это происходит в конструкторе, то соответственно, и this почистится
Re[8]: Про указатели в Qt - нравится ли вам?
От: Skorodum Россия  
Дата: 06.10.23 10:27
Оценка:
Здравствуйте, so5team, Вы писали:

S>Т.е. если this переживет исключение, то QLabel останется существовать и когда-то умрет. Но до тех пор будет "фантомом", т.к. к нему никто, по сути, доступа не будет иметь и ничего полезного с ним не сделает.

Да, но для этого надо написать сильно не каноничный код. Если есть обработка исключений, которая позволяет this жить дальше, то ничто не мешает удалить ставшим ненужным объект.
Главное, что по умолчанию утечки не будет.
Re[7]: Про указатели в Qt - нравится ли вам?
От: sergii.p  
Дата: 06.10.23 10:31
Оценка:
Здравствуйте, night beast, Вы писали:

NB>откат -- нет. передача владения произойдет в конструкторе А


так не для всего parent задают в конструкторе
Возьмём функцию QLayout::replaceWidget(QWidget* from, QWidget* to) и представим такой код

layout->replaceWidget(findWidgetByDesc("test"), new QWidget());


допустим что findWidgetByDesc бросит исключение в случае если не найлен. Мы уже как бы создали widget, к паренту привязать не успели и улетели с исключением.
Re[8]: Про указатели в Qt - нравится ли вам?
От: night beast СССР  
Дата: 06.10.23 10:35
Оценка: +1
Здравствуйте, sergii.p, Вы писали:

NB>>откат -- нет. передача владения произойдет в конструкторе А

SP>так не для всего parent задают в конструкторе

возражение не по адресу, мы с so5team обсуждали конкретный код
Re[8]: Про указатели в Qt - нравится ли вам?
От: Skorodum Россия  
Дата: 06.10.23 10:42
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>допустим что findWidgetByDesc бросит исключение в случае если не найлен. Мы уже как бы создали widget, к паренту привязать не успели и улетели с исключением.

Вы изменили пример. Добавьте this в конструктор QWidget и утечки не будет.
Re[8]: Про указатели в Qt - нравится ли вам?
От: SaZ  
Дата: 06.10.23 22:24
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, SaZ, Вы писали:


NB>>>проблема в том, что ты нифига не знаешь, захватывает addWidget владение, или нет


SaZ>>Можно, пожалуйста, пример, где в кутэ не захватывается владение?


NB>да не проблема

NB>открой хидеры и смотри функции, которые принимают указатели. по названию пытайся понять, захватывают или нет
NB>например:
NB>
NB>void QWidget::stackUnder(QWidget* w);
NB>


SaZ>>Мой основной посыл в том, что местами это непривычно (впрочем есть и определённый оверхед), но плюсы такого подхода разительно перевешивают минусы. В контексте программирования на этом фреймворке, разумеется.


NB>мой основной посыл не в плюсах или в минусах кютешного подхода (я об этом явно указал в сообщении
Автор: night beast
Дата: 04.10.23
), а в том что код должен быть понятен без дополнительного знания контекста


Наверное да. Тут как с цмейком — надо привыкнуть к инструменту.
Я задумался, походу действительно надо читать документацию и запоминать. Просто лично у меня с этим проблем не возникало, может просто за счёт большого стажа с кутэ.
Когда я пишу компоненты, то обычно проверяю — если парент у того что передали в setXXXX присутствует — я просто сохраняю указатель в QPointer. Если парента нет — то беру себе владение.
Отредактировано 06.10.2023 22:27 SaZ . Предыдущая версия .
Re[5]: Про указатели в Qt - нравится ли вам?
От: andyp  
Дата: 06.10.23 22:53
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Стандартная библиотека не поддерживает(ла) COW...


Повезло с этим имхо. Беда это в многопоточке. В лучшем случае мьютекс, где его не ждёшь. Корова — кутешечкин фейл имхо. Одна из трудноисправимых ошибок дизайна.
Re[6]: Про указатели в Qt - нравится ли вам?
От: Skorodum Россия  
Дата: 09.10.23 09:34
Оценка:
Здравствуйте, andyp, Вы писали:

A>Повезло с этим имхо. Беда это в многопоточке. В лучшем случае мьютекс, где его не ждёшь. Корова — кутешечкин фейл имхо. Одна из трудноисправимых ошибок дизайна.

В Qt потоко-безопастность классов хорошо документирована: Reentrancy and Thread-Safety

Если для передачи данных между потоками используются сигналы и слоты и данные передаются по значению, то данные копируются и дополнительно явно ничего делать не надо.
Re[7]: Про указатели в Qt - нравится ли вам?
От: andyp  
Дата: 09.10.23 11:54
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Если для передачи данных между потоками используются сигналы и слоты и данные передаются по значению, то данные копируются и дополнительно явно ничего делать не надо.


Что ты под копированием данных для объектов с COW имеешь в виду? Звучит так же мутно, как и qtшная документация Делается ли deep или shallow copy и в каком потоке это делается, если emit сигнала и вызов слота происходят в разных потоках? Есть ли гарантия, что это делается единообразно во всех релизах Qt начиная с N.K? Я не нашел внятного ответа на этот вопрос в свое время и всегда детачил копию контейнера перед тем как ее в сигнал засовывать. Ну это пока еще использовал эти контейнеры вообще.
Re[8]: Про указатели в Qt - нравится ли вам?
От: Skorodum Россия  
Дата: 10.10.23 09:40
Оценка:
Здравствуйте, andyp, Вы писали:

A>Что ты под копированием данных для объектов с COW имеешь в виду? Звучит так же мутно, как и qtшная документация Делается ли deep или shallow copy и в каком потоке это делается, если emit сигнала и вызов слота происходят в разных потоках? Есть ли гарантия, что это делается единообразно во всех релизах Qt начиная с N.K? Я не нашел внятного ответа на этот вопрос в свое время и всегда детачил копию контейнера перед тем как ее в сигнал засовывать. Ну это пока еще использовал эти контейнеры вообще.


Развернуто ответил
Автор: Skorodum
Дата: 10.10.23
с примером кода.
Re[3]: Про указатели в Qt - нравится ли вам?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.10.23 05:50
Оценка:
Здравствуйте, Shmj, Вы писали:

M>>А какие критерии у этой правильности?


S>Хотя бы согласованность с STL


А в чем проявляется несогласованность? И почему эта согласованность является критерием правильности?
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.