crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Приведение типов C++/QT
fsMark
  опции профиля:
сообщение 9.8.2008, 11:22
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 23.4.2008
Из: г. Киров
Пользователь №: 155

Спасибо сказали: 10 раз(а)




Репутация:   1  


Писал недавно одному знакомому о приведении типов в QT, решил выложить на форум вдруг комунибудь будет полезно или ктонибудь дополнит(сам пишу на QT 4 месяца :))
На мой взгляд картина выглядить слкдующим образом:

стандартная конструкция:
classA* A = new classA;
classB* B = (classB*)A;
приведет указатель на classA к указателю на classB, это стандартный способ приведения указателей унаследованный от языка C, при таком приведении не производиться никаких проверок не на этапе компиляции не на этапе исполнения со всеми вытекающими последствиями.

В C++ введенны следующие более тонкие конструкции:

classA* A = new classA;
classB* B = static_cast<classB*>A;
Эта конструкция приведет указатель на classA к Указателю на classB при том условии что класс classB является наследдником класса classA

classA* A = new classA;
classB* B = dynamic_cast<classB*>A;
Эта конструкция действует аналогично static_cast, отличие заключается в том что производиться проверка на принадлежность обекта на который сыллается А класу В, для проверки использукется информатция о типах времени выполнения(RTTI) которая естественно должна быть включена на этапе компилятции(в болщенстве современных компиляторов включена по умолчанию).
Если проверка завершается неудачно то dynamic_cast вернет нулевой указатель.
В некоторых компиляторах dynamic_cast может не работать через границы разделяемых библиотек.

QT предоставляет свое средство для приведения указателей заместо dynamic_cast:
qobject_cast аналогичен dynamic_cast для подклассов QObject(для остальных классов результат не определен), но он не зависит от RTTI и может работать через границы разделяемых библиотек.

вот пример из ассистента:
QObject *obj = new QTimer; // QTimer inherits QObject
QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj
QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == 0

Кроме того для приведения указателей на классы унаследованные от QGraphicsItem(не наследник QObject) существует qgraphicsitem_cast.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 4.6.2012, 7:28
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(kuler @ 1.10.2008, 17:04) *
Исправляйте репутацию.

готово!

==============================

моё ИМХО

1) использование static_cast иногда может быть вполне оправдано - для подстраховки на этапе компиляции.

2) Необходимость использования dynamic_cast:
a ) признак кривого проектирования. Равно как и явное приведение к void* и из него - тоже такой признак
b ) при поддержке чужого запутанного кода - это подстраховка в реалтайме (можно всегда результат каста проверить на ноль)
Поэтому лучше проектировать так, чтобы кастить через этот оператор не было необходимости.
Кроме того, для возможности применения dynamic_cast класс обязан иметь хотя бы одну виртуальную функцию, что не всегда приемлимо

3 ) Необходимость использования reinterpret_cast : см. п 2)a) . Но ещё иногда требуется, к примеру, при взамодействии с ранее написанным кодом на чистом си (пример - WinAPI , извещения WM_NOTIFY от стандартных контролов)

Критика принимается :)

Сообщение отредактировал Алексей1153 - 7.6.2012, 7:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- fsMark   Приведение типов C++/QT   9.8.2008, 11:22
- - ViGOur   Еще дополнить и можно будет оформить в статью.   9.8.2008, 14:51
- - void*   из Qt-шных, еще существуют такие касты: qdbus_cast...   9.8.2008, 17:46
- - Tonal   Для того, чтобы работал qobject_cast, нужно не тол...   10.8.2008, 14:51
- - fsMark   Если не добавлять макрос Q_OBJECT то особого смысл...   10.8.2008, 22:16
- - Tonal   Тем не менее, наследник QObject без Q_OBJECT вполн...   11.8.2008, 7:36
- - kuler   про static_cast и dynamic_cast написано не шибко п...   1.10.2008, 11:15
|- - fsMark   Цитата(kuler @ 1.10.2008, 12:15) про stat...   1.10.2008, 11:27
|- - kuler   Цитата(fsMark @ 1.10.2008, 12:27) Цитата(...   1.10.2008, 11:44
|- - AD   Цитата(kuler @ 1.10.2008, 12:44) вломы пи...   1.10.2008, 11:57
- - ViGOur   Цитата(kuler @ 1.10.2008, 12:15) про stat...   1.10.2008, 12:08
- - kuler   static_cast срабатывает на этапе компиляции, прове...   1.10.2008, 14:04
|- - Tonal   Цитата(kuler @ 1.10.2008, 18:04) static_c...   2.10.2008, 13:15
|- - kuler   Цитата(Tonal @ 2.10.2008, 14:15) Цитата(k...   2.10.2008, 15:26
- - Litkevich Yuriy   Цитата(kuler @ 1.10.2008, 18:04) Исправля...   1.10.2008, 14:13
- - Гость_Barabas_*   Благодарю за эту информацию! Искал именно это=...   2.6.2012, 12:32
- - Алексей1153   Цитата(kuler @ 1.10.2008, 17:04) Исправля...   4.6.2012, 7:28


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.12.2024, 18:12