Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема ::__non_rtti_object (число прочтений - 3073 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
::__non_rtti_object
26. Марта 2008 :: 10:23
Печать  
Мда. Что-то меня последнее время начало утомлять это наследие прошлого (про до-стандартные времена).
Пока пишешь один отдельно взятый проект - нет проблем.
Как начинаешь что-то интегрировать - грабли граблями.

Вот ведь должны

std::__non_rtti_object
std::bad_typeid
std::exception

находиться в пространстве имен std...

Так ведь нет, std::exception даже в заголовках psdk объявлен глобальным + импорт в std через using
bad_typeid и __non_rtti_object - объявлены сразу в std

А между тем, от вида объявления зависит typeid().raw_name(), а от последнего - возможность поймать это исключение в блоке catch.
Несовместимо объявил - все, не поймал.

В итоге, msvcrt (гад) бросает ::__non_rtti_object, а поймать его нереально - typeid не совпадают, ибо ловим std::__non_rtti_object
И объявить свой глобальный __non_rtti_object - тоже нереально, ибо какая-то добрая душа вставила в глобальный же заголовок строчку


using namespace std;


using namespace не должно появляться в заголовках, тем более глобальных.
даже using namespace std.

P.S.
Крик души получился Улыбка
Но реально напрягает то, что прежде чем поймать какое-то исключение crt приходится долго думать, как оно объявлено в проекте, и как оно объявлено в crt.
И как оно будет портироваться, если что.

P.P.S.
И самое смешное - в vs6 также точно объялено __non_rtti_object и bad_typeid в std.
Где crt глобальные-то объекты берет?  Нерешительный
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ::__non_rtti_object
Ответ #1 - 26. Марта 2008 :: 11:02
Печать  
kms писал(а) 26. Марта 2008 :: 10:23:
ибо какая-то добрая душа вставила в глобальный же заголовок строчку


using namespace std;


using namespace не должно появляться в заголовках, тем более глобальных.
даже using namespace std.

Согласен.
А где так написано? в stdafx.h чтоли?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ::__non_rtti_object
Ответ #2 - 26. Марта 2008 :: 12:49
Печать  
в 1cheaders.h

Ладно, не беда, уже исправлено в icpp.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: ::__non_rtti_object
Ответ #3 - 28. Марта 2008 :: 16:15
Печать  
Кстати, в МСДН написано, что вылетать bad_typeid будет только если для typeid использовать NULL. А если не NULL, то может еще и __non_rtti_object. Это я к тому, что у тебя только bad_typeid ловится. Или этого достаточно?

Возможно, конструкцию try {dynamic_cast} catch (bad_typid) лучше заменить на функцию safe_dynamic_cast. Тогда вызов будет выглядеть как
SomeClass *pObj = safe_dynamic_cast<SomeClass *> (pOtherObj);

Тогда, если вдруг понадобится при кастах ловить что-то еще, то будет достаточно поменять только одну функцию. Да код проще будет.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ::__non_rtti_object
Ответ #4 - 28. Марта 2008 :: 16:25
Печать  
Uzhast писал(а) 28. Марта 2008 :: 16:15:
Кстати, в МСДН написано, что вылетать bad_typeid будет только если для typeid использовать NULL. А если не NULL, то может еще и __non_rtti_object. Это я к тому, что у тебя только bad_typeid ловится. Или этого достаточно?

Кстати, в стандарте об __non_rtti_object - вообще ни слова.
Но у MS он унаследован от bad_typeid - следовательно достаточно.

Но поймать именно ::__non_rtti_object не представляется возможным.

Цитата:
Возможно, конструкцию try {dynamic_cast} catch (bad_typid) лучше заменить на функцию safe_dynamic_cast. Тогда вызов будет выглядеть как
SomeClass *pObj = safe_dynamic_cast<SomeClass *> (pOtherObj);

Логично.
Ну, в ТП удобнее было объявить отдельную функцию ProviderCheckedDowncast для приведения типа, так что там нормально.

А вот в остальном - особенно учитывая, что вместо левого ::bad_typeid на стандартных системах будет прилетать std::bad_typeid, - действительно стоит вынести в отдельный шаблон.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ::__non_rtti_object
Ответ #5 - 28. Марта 2008 :: 19:08
Печать  
Uzhast писал(а) 28. Марта 2008 :: 16:15:
Возможно, конструкцию try {dynamic_cast} catch (bad_typid) лучше заменить на функцию safe_dynamic_cast. Тогда вызов будет выглядеть как
SomeClass *pObj = safe_dynamic_cast<SomeClass *> (pOtherObj);

Сделал, короче.

Главное - это все же желание видеть упоминание нестандартного ::bad_typeid в одном месте.
Не скажу в каком. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать