Russian Qt Forum
Сентябрь 22, 2024, 02:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Избегание постоянного использования dynamic_cast  (Прочитано 4656 раз)
Андрей
Гость
« : Сентябрь 11, 2012, 18:34 »

     В проекте использую очень много dynamic_cast. По сути можно его и не использовать, что я и хочу сделать. Во многих случаях у объекты возвращают тип перечислением, и можно использовать static_cast.
    Но в одном месте так делать нельзя...

    Есть несколько виджетов, которые можно перетаскивать мышкой. Тип у всех разный. Общего предка кроме Qt-тишных нет. Допустим один наследую от QLabel, другой от QFrame.
При идентификации объекта, который был захвачен мышью, делать много dynamic_cast совсем стрёмно.

    Решил использовать Q_PROPERTY для получения типа объекта, вроде, работает.

   Это нормальный вариант или есть другие способы?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Сентябрь 11, 2012, 19:14 »

Использование пропердей "не хуже остальных", а действительно хороший способ мне неизвестен. Нормально полагать что таскаемое мышей есть QWidget и задействовать его методы
Записан
Андрей
Гость
« Ответ #2 : Сентябрь 11, 2012, 19:26 »

Ещё был вариант с множественным наследованием, когда один из предков (искусственный) имел бы функцию, возвращающую тип.
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 11, 2012, 20:37 »

Та зачем тип? Перетаскивается и ладно Улыбающийся
PS а так по идее проперти ничем не хуже динамика Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Сентябрь 11, 2012, 20:41 »

Есть ещё вариант object->metaObject()->className().

Так же для наследников QObject есть qobject_cast, который работает быстрее dynamic_cast и даже, по идее, при отключенном RTTI (не пробовал).

А вообще почему так уж хочется избавиться от dynamic_cast? Неужели это критично по производительности? Или просто хочется и всё тут?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 11, 2012, 21:15 »

Ещё был вариант с множественным наследованием, когда один из предков (искусственный) имел бы функцию, возвращающую тип.
А смысл? В приведенном Вами примере (таскание мышей) не видно зачем Вам мучительно определять тип, любой QWidget может быть перенесен
Записан
Akon
Гость
« Ответ #6 : Сентябрь 13, 2012, 11:40 »

А чем в вашем случае плох dynamic_cast/qobject_cast?

В способе идентификации типа по перечислению есть один, иногда критичный, недостаток - нельзя отследить граф наследования. Что бы это сделать нужно использовать уже флаги или список.

Идентификация типа по перечислению, как правило, используетмся, когда важна производительность (нпример, QEvent). Для гуя это неактуально.
Записан
Андрей
Гость
« Ответ #7 : Сентябрь 14, 2012, 17:09 »

   В примере Qt делается static_cast . Я пишу модуль по этому шаблону.
Хотя лучшим решением (в рамках шаблона) будет привести всё к общему знаменателю и сделать виджеты всё-таки одного типа. В отличие от примера, я ещё проверяю тип виджета, на который отпускаю захваченный виджет и произвожу действия в зависимости от этого типа. Думаю, не я первый это делаю)))
  dynamic_cast работает. По идее ограничения по производительности не стоит. Но захотелось потренироваться.
  qobject_cast пробовал. Что-то не пошло. Он, вроде, не преобразует в объекты пользовательских типов, наследуемых от QObject, только в чистые Qt-классы.
 А вот object->metaObject()->className() неплохой вариант.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Сентябрь 14, 2012, 21:43 »

qobject_cast пробовал. Что-то не пошло. Он, вроде, не преобразует в объекты пользовательских типов, наследуемых от QObject, только в чистые Qt-классы.
Преобразует, по крайней мере если пользовательский тип объявлен с Q_OBJECT.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 22.