![]() |
|
Модераторы: 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 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |