Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dynamic_cast 
:(
    Опции темы
xTr1m
Дата 12.2.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



День добрый. Попытался привести типы при помощи dynamic_cast
Код

CEdit *pEdit = dynamic_cast<CEdit*>(GetDlgItem(nID));

в результате получил 0, а вот так вот приведение сработало
Код

CEdit *pEdit = reinterpret_cast<CEdit*>(GetDlgItem(nID));

Собственно вопрос: почему dynamic_cast не смог привести от Cwnd* к CEdit*? Или он приводит только он наследника к базовому?
PM MAIL WWW ICQ   Вверх
Alca
Дата 12.2.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 6
Всего: 50



Если у тебя предком твой диалог - вызывай
Код

CEdit *pEdit = dynamic_cast<CEdit *>(GetParent()->GetDlgItem(nID));
assert(NULL != pEdit);


Это сообщение отредактировал(а) Alca - 12.2.2010, 16:39


--------------------
PM WWW ICQ Skype Jabber   Вверх
unicuum
Дата 12.2.2010, 17:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(xTr1m @  12.2.2010,  14:45 Найти цитируемый пост)
Или он приводит только он наследника к базовому? 

Цитата
Принципиальным преимуществом dynamic_cast является то, что ваша программа проверяет ваше предположение во время исполнения. Если (предположительно) производная сущность в действительности не является объектом производного типа, то dynamic_cast либо вернет NULL (при преобразовании указателей), либо выбросит исключение (при преобразовании ссылок).




--------------------
user posted image
обычный день на винграде
PM   Вверх
Earnest
Дата 14.2.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(xTr1m @  12.2.2010,  15:45 Найти цитируемый пост)
в результате получил 0, а вот так вот приведение сработало

reinterpret_cast - никакое не приведение, а просто другая интерпретация указателя. Оно всегда работает. Но не факт, что правильно. Что касается первого предложения, то, видимо, контрол не CEdit, вот и все. Причем пойми правильно: между виндовским эдитом и объектом CEdit  связь зыбкая. Если ты нигде не создал объект типа CEdit для данного контрола, то ему неоткуда взяться. GetDlgItem возвращает ВРЕМЕННЫЙ объект типа CWnd. Приведение reinterpret безопасно, т.к. CEdit не содержит дополнительных членов данных, а поведение в любом случае определяется оконной функцией.



--------------------
...
PM   Вверх
Dem_max
Дата 14.2.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Вообще зло использовать reinterpret_cast, если до этого дело доходит, значит программер из вас еще тот. 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Earnest
Дата 14.2.2010, 18:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Dem_max, так голословно утверждать нельзя. Особенно, программируя под Виндоус и используя АПИ. Там без приведения типов ну никак.  Например,стандартная сигнатура  процедуры потока имеет аргумент DWORD/ Обычно туда передают какой-то объект. И как без приведения. Или взять сами оконные процедуры.Конечно, если приведение (любое) встречается на каждом шагу и не связано с АПИ или кодом, АПИ расширяющем, здесь есть о чем задуматься. 


--------------------
...
PM   Вверх
Dem_max
Дата 15.2.2010, 05:49 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Цитата

Особенно, программируя под Виндоус и используя АПИ


Особенно тут вообще не нужно ничем кастовать. Особенно.  Ибо после таких программистов у нас и получаются глючные программы.
Любой каст это зло.  Если дело доходит до каста значит вы делаете что-то не правильно.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Earnest
Дата 15.2.2010, 09:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Dem_max, я же привела пример - процедура потока и распаковка аргументов оконных сообщений. Ну и покажи, как здесь без приведения обойтись. А так просто утверждать - зло - глупость полная. А глючные программы у нас получаются после программистов, которые думают не головой, а штампами.


--------------------
...
PM   Вверх
Dem_max
Дата 15.2.2010, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Для распаковки оконных сообщений подойдет и приведение в стиле Си.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Earnest
Дата 15.2.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Dem_max @  15.2.2010,  10:55 Найти цитируемый пост)
приведение в стиле Си

гораздо хуже (опаснее), чем reinterpret_cast. Это приведение объединяет в себе возможности всех трех cpp-кастов. Но в отличие от них, просто глядя на локальный код, невозможно точно сказать, что получается в результате (без анализа контекста). 
Ты уж меня извини, но как я и думала, в голове у тебя каша из штампов. smile 



--------------------
...
PM   Вверх
Dem_max
Дата 15.2.2010, 10:37 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



Думай ка хочешь, но я останусь при своем мнении. И отсутствии глюков в программе.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
W4FhLF
Дата 15.2.2010, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



Dem_max, Earnest всё правильно сказала. Из твоих сообщений следует, что ты не понимаешь как работают касты в С и С++, в чём семантическая суть reinterpret_cast, поэтому вместо того, чтобы спорить об очевидных вещах в публичном месте, просветись по этой теме. А пока что ты неправ. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
azesmcar
Дата 15.2.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Цитата(Dem_max @  15.2.2010,  05:49 Найти цитируемый пост)
Любой каст это зло.  Если дело доходит до каста значит вы делаете что-то не правильно. 

Книжек начитался? Кастов нужно по возможности избегать (т.е. проектировать систему так, чтобы касты были не нужны), а не считать их злом. Даже reinterpret_cast может понадобиться. Для меня надобность в cast-е - повод призадуматься и только. Не припоминаю на своей практике ни одной ошибки в программе связанной с использованием приведения типов. Стереотипы - зло, касты - необходимость в любом языке, со строгой типизацией.

Это сообщение отредактировал(а) azesmcar - 15.2.2010, 15:46
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1036 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.