Приведение типов C++/QT |
Здравствуйте, гость ( Вход | Регистрация )
Приведение типов 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. |
|
|
ViGOur |
9.8.2008, 14:51
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Еще дополнить и можно будет оформить в статью.
|
|
|
Текстовая версия | Сейчас: 28.12.2024, 18:35 |