![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| BlHol |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 26.11.2005 Репутация: нет Всего: нет |
Добрый день!
Пытался задать этот вопрос в теме про указатели, но никто не отвечает, а нужно сильно срочно Итак. Маленький вопрос: Такой код:
Первая часть (до "=") понятна: указатель на объект класса. А вот это как понимать?:
Заранее благодарен. С уважением. |
||||
|
|||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
вообще-то, лучше так:
то что справа от = это приведение указателя Sender к типу TComponent*. Это необходимо, поскольку Sender объявлен как TObject* Sender. Надо чтобы типы справа и слева от = совпадали, или неявно приводились один к другому. В данном случае неявное приведение невозможно, поэтому мы делаем его явно. Второй способ лучше, поскольку оператор dynamic_cast проверяет возможность приведения типа, а если оно невозможно, возвращает NULL. |
|||
|
||||
| adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
Это привидение типа. Я могу предположить (так как не вижу кода), что Sender - переменная типа void *
Компилятор не позволит присвоить переменной с типом TComponent * значение переменной с типом void *. Хотя, и тот и тот тип - это указатели, и занимают по 4 байта. Чтобы сказать компилятору, что вы всё таки хотите выполнить такое присвоение, вы должны переопределить тип переменной Sender: (Новый_тип)Переменная В качестве нового типа вы указываете: Указатель на TComponent. --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
это называется приведение типа, т.е. в данном выражении считать Sender указателем на TComponent |
|||
|
||||
| adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
Пока писал, ответили
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Судя по всему имеем:
1. TObject* sender (или какой там класс, суть в том, что TComponent - наследник TObject) 2. Хотим вызвать метод или обратиться к полю из TComponent (не TObject) 3. Знаем, что фактически sender указывает на экземпляр класс TComponent Что делаем: (TComonent*) sneder - просто приводим к типу указателя на TComponent ЗЫ Хотя лучше юзать reinterpret_cast |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
чем же лучше? dynamic_cast надо использовать |
|||
|
||||
| cozzzy |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
||||
|
||||
| MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
dynamic_cast используется при приведении указателя/ссылки на объект полиморфного базового класса к производному
если речь о C++
зачем тогда reinterpret_cast? Лучше static_cast (если точно знаешь что void* Sender указывает на TComponent) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
| cozzzy |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
Как раз для void* самое лучшее приведение - reinterpet_cast
Основное назначение static_cast - приведение простых типов вроде int->char, float->double |
|||
|
||||
| LuckLess |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
ерунда. static_cast единственно правильное решение для преобразования родитель - потомок , если уверен, что оно возможно. dynamic_cast если не уверен. вообще dynamic_cast лучше не использовать. вот попробуй примерчик.
dynamic_cast тоже даст правельный результат, но зато убъет больше времени(значительно больше) + требует RTTI. |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
вот примерчик на все преобразования, кому интересно.
Но только не подумайте, что преобразования в стиле С безопасны. Они в разных случаях ведут себя по разному. |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
в данном случае даже не скомпилируется еще раз
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
||||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
для каждого случая свой вариант преобразования в случае неполиморфных классов (предок-потомок) - static_cast, в случае несвязанных никаким отношением классов - reinterpret_cast, в случае полиморфных - dynamic_cast в твоем компилируемом варианте в общем случае безопасен только dynamic_cast потому как в случае
в a будет адрес предположительно (думает компилятор dynamic_cast вернет 0 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
нет. dynamic_cast применяться не в случае полиморфизма, а в случае кода полиморфизм не вышел, и когда надо срочно сдавать проект а переделывать нету времени. dynamic_cast убивает полиморфизм как понятие. а static_cast работает одинаково как с полиморфнами типами, так и нет. хотя приведение предок - потомок в любом случае - ошибка стадии проектирования, но static_cast меньшая ошибка нежели dynamic , поскольку последний не просто гробит полиморфизм как понятие, но еще и тащит за собой тяжолую библиотеку + подторжаживает систему. |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
см. мой предыдущий пост, не во всех случаях
если неправильно применять, то любое средство языка гробит функциональность, для реализации которой оно вводилось вообще dynamic_cast - полезная вещь, но, естественно все должно быть по делу -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
пф. спорить чуствуеться бесполезно.
и что? что в том посте то? брр. ясное дело что если робитель - не потомок, то статик каст наделает бед , также и реинтрепрет. не в этом дело совсем. Это совершенно не означает что надо использовать динамик. если я точно знаю что родитель - на самом деле потомок - надо использовать статик и точка. Как динамик каст не применяй - он гробит ООП. можно сказать что динамик каст в ООП - это goto в структурном программировании |
|||
|
||||
| cozzzy |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
Цитата Bruce Eckel "Thinking in C++, vol.2":
Добавлено @ 21:56 И еще из MSDN:
|
||||||
|
|||||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
да яне спорю что иногда. оооочень редко динамик каст можно применить, но говорить в этом случая о полиморфизме нельзя!
я и говорю, что статик надо использовать только кодга знаешь что родитель - потомок. |
|||
|
||||
| MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
еще раз говорю, не всегда
кстати, этот пример опрвергает Ваше утверждение
Вы не задавались вопросом, зачем он тогда вообще нужен? и вообще dynamic_cast - неотъемлимая часть RTTI, RTTI в общем случае нужен и оправдан т к (см. Дизайн и эволюция C++ ст. 321-322) => dynamic_cast как механизм RTTI оправдан и не надо его сравнивать с goto, который всегда можно заменить в коде и который делает этот код менее понятным dynamic_cast нужен не только ради реализации подобного кода, который несомненно плох и применение в нем dynamic_cast неоправдано
ps. спор действительно бесполезный Это сообщение отредактировал(а) MAKCim - 4.5.2006, 22:44 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
||||
|
||||
| cozzzy |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
||||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
rtti в большинстве своем нарушает принципы ООпП.
да и медленный он.. |
|||
|
||||
| Kostt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 169 Регистрация: 8.1.2006 Где: Томск Репутация: 1 Всего: 3 |
RTTI во многих случаях просто необходим. А самому его реализовывать - еще медленнее будет. Так что спор ни о чем.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |