LINUX.ORG.RU

[C++] *_cast`ы

 


0

1

Друзья, прошу помощи в постижении дзен.

Никак не найду на гугло-просторах ответа на главный вопрос бытия: какой *_cast в C++ нужно применить в конкретный момент.

Сложилось мнение, что dynamic_cast нужно использовать для отсеивания неподходящих потомков, расположенных по указателю на родительский класс; reinterpret_cast - для приведения указателей; static_cast - для всего остального. Но пятая точка вместе с коллегой подсказывают, что я могу ошибаться.

Объясните пожалуйста в каких случаях нужно какие cast`ы использовать и собственно в чем их главное отличие.

Заранее благодарен за обмен опытом (:

★★
Ответ на: комментарий от Booster

еще qobject_cast работает через границы динамических библиотек (что опять же является следствием не использования rtti)

annulen ★★★★★
()
Ответ на: комментарий от annulen

>ОНО НЕ ТРЕБУЕТ RTTI

Так я про это и написал, только полиморф имеет rtti.Насчёт линейной архитектуры и скорости, не понял.

Booster ★★
()
Ответ на: комментарий от annulen

>еще qobject_cast работает через границы динамических библиотек (что опять же является следствием не использования rtti)

rtti не определит объект созданный в другом модуле? Косяк. В qt конечно лучше юзать qobject_cast.

Booster ★★
()
Ответ на: комментарий от Booster

Во-первых, можно спокойно юзать no-rtti. Значительно урежет бинарники. На embedded системе можно собирать qt без rtti - PROFIT

dynamic_cast обычно работает медленнее qobject_cast, и он становится медленнее при усложнении генеалогии классов

annulen ★★★★★
()
Ответ на: комментарий от annulen

>dynamic_cast обычно работает медленнее qobject_cast, и он становится медленнее при усложнении генеалогии классов

В это мне пока поверить сложно.

всего один заголовок под bsd, и никакого ртти. Явно определяешь, к каким классам можно кастовать твой класс - PROFIT

Такого добра мы и сами можем написать вагон и маленькую тележку, но меня пока не мучает вопрос отключения rtti.

Booster ★★
()
Ответ на: комментарий от Booster

>В это мне пока поверить сложно.

код с проверкой типа через виртуальный метод и последующий статик_каст работают намного быстрее. qobject_cast где-то посередине между ними

annulen ★★★★★
()
Ответ на: комментарий от Dikar

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

annulen ★★★★★
()
Ответ на: комментарий от panter_dsd

откуда сведения?

на МСВС 3.0.16 с помощью qmake4 и gcc3/gcc4 не собирается даже окно с HelloWorld лейблом на Qt4. Посвятите пожалуйста как вы собирали?

Dikar ★★
() автор топика
Ответ на: комментарий от annulen

Честно говоря нам не хватило мозгов/терпения/опыта/etc для сборки Qt4. 2 сотрудника занимались этим, но плюнули после 20-30 зависимостей на gcc4.x.x, который требовался для сборки. С пакетами т -же проблемы. А репы полноценно подключить не выйдет так как на отдел один ноут с подключенным интернетом и лимитом на него 1Гб в месяц на 14 человек. Так же существует местная нелицензированная версия на которой вообще все через сами понимаете какое место работает: то Qt3.3.3 вместо Qt3.3.3 подключит, то bash вместо sh, и соответственно неизвестно что потребует в качестве зависимостей этот дистрибутив, так как glibс там новее, а Qt4 присутствуют но ни разу не работают.

Dikar ★★
() автор топика
Ответ на: комментарий от Dikar

Не знаю как конкретно в этой версии МСВС, но qt4 в нем уже больше года. Пройдись поиском по prog.org.ru.

panter_dsd ★★★★
()
Ответ на: комментарий от Dikar

>2 сотрудника занимались этим, но плюнули после 20-30 зависимостей на gcc4.x.x, который требовался для сборки.

с 3.4 все должно собираться. у нас (правда с хитрыми патчами) собирается даже 2.95.3 :)

А репы полноценно подключить не выйдет так как на отдел один ноут с подключенным интернетом и лимитом на него 1Гб в месяц на 14 человек.

Можно подключить, установить Qt4 на одной машине, и выключить. Затем расшарить нужные пакеты с помощью локального репозитория

так как glibс там новее

ищите репы для своей версии рхела (напр., если ядро 2.6.9 - это рхел4). Никогда не ставьте пакеты от других версий.

annulen ★★★★★
()
Ответ на: комментарий от Dikar

У вас какой-то неправильный рхел. Придется компилить. Если повыключать ненужные модули в Qt, должно без прооблем собраться 3.4.6

annulen ★★★★★
()
Ответ на: комментарий от annulen

у нас мсвс, являющийся rhel с патченным-перепатчанным ядром переименованным софтом. BolgeonOS для ВСРФ =)

Dikar ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.