Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.219.217] |
|
Страницы: (32) « Первая ... 21 22 [23] 24 25 ... 31 32 ( Перейти к последнему сообщению ) |
Сообщ.
#331
,
|
|
|
Цитата JoeUser @ Может. Ибо разрабы в QObject встроили звездолет, и для этого придумали свой дополнительный инструментарий - moc. Вот он-то и занимается тем, что на основе метаинформации начинает творить "чудеса". И тем не менее, если написать new от класса-не потомка QObject - автоматического удаления не будет, ибо moc это не обрабатывает. Это по твоему примеру: Поэтому и не знаешь что такое RAII и лепишь вские goto куда не попадя. А если кто то напишет у себя что то типа typedef unsigned int QUintPrimitive - то и утечку поиметь не долго. Вообще огонь. Зачем такую путаницу вводить - совершенно не понятно. По мне так проще QUnique_ptr/QShared_ptr/QWeak_ptr нарисовать и не вводить людей в заблуждение. Может это маркетинговый ход такой? Типа был нормальный С++сник, с годика два пописал на QT, и на С++ уже программировать не может, только на QT и остается писать, какой то свой изолированный от реальности мир этот ваш QT. Там поди и не все фишки новых стандартов нормально юзнешь? |
Сообщ.
#332
,
|
|
|
Цитата Wound @ Зачем такую путаницу вводить - совершенно не понятно. Первый релиз Qt состоялся с 1996 году, какие нахрен shared_ptr тогда? Тогда код писали на ламповых мониторах! Добавлено Цитата Wound @ Там поди и не все фишки новых стандартов нормально юзнешь? Все, что касается производных от QObject - с опаской. За использование исключений - расстрел сразу! Но тут я ни разу не парюсь, вон Rust тоже не парится. |
Сообщ.
#333
,
|
|
|
Вот поэтому я и выкинул Qt на головы. На кой хрен ещё один managed с++ по-над ещё одним дотНетом? Отказоустойчивости нет, обобщённости нет, населена велосипедами.
Добавлено Цитата applegame @ Ой-ой-ой, а правильный скоп влеплять каждый раз никто не забывает, ага. Как хорошо в D, в котором есть scope(exit). И не нужно ни goto ни бестолковых классов. |
Сообщ.
#334
,
|
|
|
Цитата Qraizer @ Вот поэтому я и выкинул Qt на головы. Ну а я на свою голову освоил, надо было GUI под FreeBSD+кеды когда-то лепить. Но никогда не был этой либой доволен - любой продукт на ней истекает жЫром. Вот поэтому я и обратил свой взор на nana. 2 меговый хелоуворлд меня устраивает, пострипанный Qt-шны 27 меговый - бесит. |
Сообщ.
#335
,
|
|
|
На, вот. Отрыл-таки в Клубе энтот твой scope. Без Поиска, он не работает. Скопипасчу, не жалко.
namespace ScopeD { class SuccessCase {} success; class FailureCase {} failure; class DoneCase {} done; class scope { std::function<void(void)> fn1, fn2; public: template <typename T> scope(SuccessCase, T&& cl) try : fn1(std::move(cl)), fn2([](){}) {} catch (...) { throw; } template <typename T> scope(FailureCase, T&& cl) try : fn1([](){}), fn2(std::move(cl)) {} catch (...) { cl(); throw; } template <typename T> scope(DoneCase, T&& cl) try : fn1(std::move(cl)), fn2(fn1) {} catch (...) { cl(); throw; } ~scope() { if (std::uncaught_exceptions() != 0) fn2(); else fn1(); } }; } using namespace ScopeD; struct Foo { Foo(std::string s) { std::cout << s; } ~Foo() { std::cout << "1"; } }; try { scope guard1(done, [](){ std::cout << "2"; }); scope guard2(success, [](){ std::cout << "3"; }); Foo f("0"); scope guard3(failure, [](){ std::cout << "4"; }); throw std::runtime_error("runtime"); scope guard4(done, [](){ std::cout << "5"; }); scope guard5(success, [](){ std::cout << "6"; }); scope guard6(failure, [](){ std::cout << "7"; }); } catch (const std::exception& e) { std::cout << "Exception: " << e.what(); } std::cout << std::endl; |
Сообщ.
#336
,
|
|
|
Цитата Wound @ Зачем такую путаницу вводить - совершенно не понятно. По мне так проще QUnique_ptr/QShared_ptr/QWeak_ptr нарисовать и не вводить людей в заблуждение. Это пошло ещё с самого зарождения Qt, тогда программировали по другому и всё, что тут писалось выше, ещё толком не было широко распространено. Ну и да, ты прав, по духу Qt это скорей "си с классами" библиотека, нежели плюсовая, и многие прожженые плюсовики её недолюбливают. Я сам ругаюсь на неё местами. И время от времени слышу, что "кутешник" это почти что ругательство в среде плюсовиков Цитата Wound @ Там поди и не все фишки новых стандартов нормально юзнешь? Да какой там новых. Там даже move конструкторов для тамошних смартпоинтеров не предусмотрено Так что если мне нужно сделать смартпоинтер, который вызывает deleteLater (это qt-way способ безопасно удалить QObject из любого потока), то я предпочитаю написать unique_ptr с кастомным deleter-ом, чем юзать QScopedPtr даже несмотря на то, что последний умеет удалять указатели на qobject посредством deleteLater из коробки. |
Сообщ.
#337
,
|
|
|
Цитата Qraizer @ Спасибо, что лишний раз подтвердил убогость и уродство плюсов. На, вот. Отрыл-таки в Клубе энтот твой scope. Без Поиска, он не работает. Скопипасчу, не жалко. |
Сообщ.
#338
,
|
|
|
Цитата JoeUser @ Первый релиз Qt состоялся с 1996 году, какие нахрен shared_ptr тогда? Тогда код писали на ламповых мониторах! И чего? Первый релиз плюсов состоялся в 1983 году, только где тот С++ и сегодняшний, это уже два совершенно разных языка. Переписать такие вещи раз плюнуть. Сначала пишешь нормальные RAII обертки, затем пишешь например дополнительный базовый тип, который лишен такого странного поведения, анонсируешь все это, помечаешь как deprecated старую логику. А потом потихонечко от нее избавляешься. Это все реализуемо, было бы желание. А так мы имеем недоязык, недофреймворк, который подсаживает людей на себя, вангую после длительной, плотной работы на нем - ты уже не сможешь нормально писать на С++. Да ладно бы это был отдельный язык, куда не шло, а это же еще и юзает С++. Цитата JoeUser @ Все, что касается производных от QObject - с опаской. За использование исключений - расстрел сразу! Но тут я ни разу не парюсь, вон Rust тоже не парится. А причем тут Rust ? Rust - это отдельный язык программирования со своим синтаксисом и остальным. А QT - это что такое ? |
Сообщ.
#339
,
|
|
|
Цитата Wound @ Переписать такие вещи раз плюнуть. У Qt тож есть своя команда аналитиков - видимо что-то для посчитали не выгодным. Цитата Wound @ было бы желание Не-не-не - был бы профит в дополнительной прибыли, думаю и желание бы появилось. Цитата Wound @ А причем тут Rust ? При том, что нет там месту исключениям и их обработке, они так решили. |
Сообщ.
#340
,
|
|
|
Цитата OpenGL @ Это пошло ещё с самого зарождения Qt, тогда программировали по другому и всё, что тут писалось выше, ещё толком не было широко распространено. Ну и да, ты прав, по духу Qt это скорей "си с классами" библиотека, нежели плюсовая, и многие прожженые плюсовики её недолюбливают. Я сам ругаюсь на неё местами. И время от времени слышу, что "кутешник" это почти что ругательство в среде плюсовиков Ну я пару раз пробовал за него садиться, и все разы я не понимал как на нем что то сделать нормальное, плевался и бросал. Но вот конкретно до таких вещей я не доходил, так бы и не садился за него вовсе. Цитата OpenGL @ Да какой там новых. Там даже move конструкторов для тамошних смартпоинтеров не предусмотрено Так что если мне нужно сделать смартпоинтер, который вызывает deleteLater (это qt-way способ безопасно удалить QObject из любого потока), то я предпочитаю написать unique_ptr с кастомным deleter-ом, чем юзать QScopedPtr даже несмотря на то, что последний умеет удалять указатели на qobject посредством deleteLater из коробки. Мда... Так они бы уже не парились и написали для него свой ЯП, чем переписывать и уродовать С++ Добавлено Цитата JoeUser @ У Qt тож есть своя команда аналитиков - видимо что-то для посчитали не выгодным. Я думаю это маркетинговый ход такой. Сначало подсадить людей на QT, потом спустя время человек кроме QT в тех же плюсах уже профнепригоден, вуаля, когда человек поймет это - для него уже станет поздно. И вот развивают свою экосистему QT. Цитата JoeUser @ Не-не-не - был бы профит в дополнительной прибыли, думаю и желание бы появилось. Я думаю если бы QT не занимался вот этим вот, а вел себя как некий фреймворк использующий С++ по правилам С++, а не изменяющий его правила, то у него была бы в разы больше аудитория. Цитата JoeUser @ При том, что нет там месту исключениям и их обработке, они так решили. И чего? Ты не путай волчий хрен и колбасу. Rust - это язык программирования. В Ассемблере тоже нет исключений, и чего? В Prolog тоже нет исключений. Дело то не в том есть исключения или нет, дело в том - что они есть в языке, а фреймворк тебе их запрещает юзать, вернее тебе разрабы запрещают юзать. QT - это язык программирования? ЕМНИП он компилятор С++ юзает. Это обычный фреймворк, только я не слышал больше фреймворков, которые берут изменяют логику работы языка который используют. |
Сообщ.
#341
,
|
|
|
Цитата Wound @ а фреймворк тебе их запрещает юзать, вернее тебе разрабы запрещают юзать. Ну там вообще немного не так. Запрет касается только одной ситуации, ЕМНИП, нельзя генерировать исключения в обработчике событий Qt. Что-то типа нельзя: try { connect(thread, &MyThread::started, this, &Element::count); // слот count() может бросать исключения } catch(const X& e) {} Но если тебе это нужно прямо очень, что кушать не можешь, можно обойти так: class BadCounter { Q_OBJECT public slots: void count() { throw std::runtime_error("хана, исключение!"); } }; class BadCounterAdaptor { Q_OBJECT BadCounter* counter; public: BadCounterAdaptor(BadCounter* iCounter):counter(iCounter) {} public slots: void count() { try { counter->count(); } catch (const std::runtime_error& e) { std::cerr << e.what() << std::endl; } cstch (...) { std::cerr << "Случилось страшное!" << std::endl; } } }; int main() { BadCounter Counter; BadCounterAdaptor Adaptor(&Counter); QThread* Thread = new QThread(); connect(Thread,&QThread::started,&Adaptor,&BadCounterAdaptor::count); Thread.start(); ... delete Thread; } В остальных случаях - вполне можно пользоваться исключениями нативно. Поэтому тут скорее не запрет на все - а предложение "мол мы вот так либу запроектировали, не будьте калдырями - поддерживайте нашу идеологию, ну или валите на MFC нафик!" Добавлено Цитата Wound @ ело в том - что они есть в языке, а фреймворк тебе их запрещает юзать Мы живем в несправедливом мире! Часто за все нужно платить |
Сообщ.
#342
,
|
|
|
Цитата JoeUser @ "мол мы вот так либу запроектировали, не будьте калдырями - поддерживайте нашу идеологию, ну или валите на MFC нафик!" Ааа, QTшники живут еще в 2008 году наверное MFC - уже много лет как умер, он уже не разрабатывается, и не поддерживается даже мелкомягкими. А че по поводу нового стандарта они говорят? Пишите вот так как мы напроектировали или валите на свой С++17 или какой там уже? С++20? Они сами себе яму то и копают. Когда профит от языка превысит профит от QT его просто не будут использовать. Я не знаю какой сейчас профит от QT? Единственное что я вижу - это GUI под Linux, и то, это потому что я не знаю какие там фреймворки для Linux'ов есть сейчас. Потому что в остальном его обходит тот же .net core/C++, для мобильных платформ Java со всякими Unity. Добавлено Цитата JoeUser @ Мы живем в несправедливом мире! Часто за все нужно платить А профит от него какой? С++ с новый стандартом уже становится кросплатформенным в плане работы с системными API(потоки там всякие, файловая система, и т.д.), туда добавляют новые примочки каждый год. |
Сообщ.
#343
,
|
|
|
Цитата Wound @ А профит от него какой? Ну начинался он GUI конечно. К тому времени у него основные конкуренты были GTK и wxWindows (ныне wxWidgets). Сейчас Qt сильно разросся во что только можно. Под спойлером либы, по названию поймешь, чем щя рулит Qt: Скрытый текст Qt5Bluetooth.dll Qt5Charts.dll Qt5Concurrent.dll Qt5Core.dll Qt5DBus.dll Qt5Designer.dll Qt5DesignerComponents.dll Qt5Gamepad.dll Qt5Gui.dll Qt5Help.dll Qt5Location.dll Qt5Multimedia.dll Qt5MultimediaQuick.dll Qt5MultimediaWidgets.dll Qt5Network.dll Qt5NetworkAuth.dll Qt5Nfc.dll Qt5OpenGL.dll Qt5Positioning.dll Qt5PositioningQuick.dll Qt5PrintSupport.dll Qt5Qml.dll Qt5QmlModels.dll Qt5QmlWorkerScript.dll Qt5Quick.dll Qt5QuickControls2.dll Qt5QuickParticles.dll Qt5QuickShapes.dll Qt5QuickTemplates2.dll Qt5QuickTest.dll Qt5QuickWidgets.dll Qt5RemoteObjects.dll Qt5Script.dll Qt5ScriptTools.dll Qt5Scxml.dll Qt5Sensors.dll Qt5SerialBus.dll Qt5SerialPort.dll Qt5Sql.dll Qt5Svg.dll Qt5Test.dll Qt5TextToSpeech.dll Qt5WebChannel.dll Qt5WebSockets.dll Qt5Widgets.dll Qt5WinExtras.dll Qt5Xml.dll Qt5XmlPatterns.dll Qt53DAnimation.dll Qt53DCore.dll Qt53DExtras.dll Qt53DInput.dll Qt53DLogic.dll Qt53DQuick.dll Qt53DQuickAnimation.dll Qt53DQuickExtras.dll Qt53DQuickInput.dll Qt53DQuickRender.dll Qt53DQuickScene2D.dll Qt53DRender.dll |
Сообщ.
#344
,
|
|
|
Цитата JoeUser @ Сейчас Qt сильно разросся во что только можно. Под спойлером либы, по названию поймешь, чем щя рулит Qt: Ну я тут вижу только GUI. Графику на нем я бы не стал писать, есть куча фреймворков и движков куда круче с полной поддержкой языка. Остальное либо мелочи, либо устаревшее что то, либо просто как с боку бантик. Для каких то небольших проектов возможно и сойдет, но небольшие проекты сейчас все больше разрабатывают для мобильных платформ, они там более востребованы. |
Сообщ.
#345
,
|
|
|
Цитата applegame @ Цитата Qraizer @ Спасибо, что лишний раз подтвердил убогость и уродство плюсов. На, вот. Отрыл-таки в Клубе энтот твой scope. Без Поиска, он не работает. Скопипасчу, не жалко. И в чем же такая принципиальная разница между: scope(exit) foo(1, 2, 3); и scope guard(exit, []{foo(1, 2, 3);}); ? |