Бросать bad_cast при конвертации указателей с dynamic_cast? - PullRequest
1 голос
/ 14 августа 2011

dynamic_cast генерирует bad_cast исключение, если вы приводите ссылку, но, как я знаю, стандартные указатели считаются ссылками, то есть указатель является типом ссылки.
Так должен ли я получать bad_cast при приведении указателей?

Этот вопрос возник из блока try-catch со страницы этой страницы . Этот блок try-catch не подходит?

Ответы [ 3 ]

5 голосов
/ 14 августа 2011

Нет с указателями в случае неправильного приведения, dynamic_cast вернет null.
Кроме того, dynamic_cast работает только для полиморфных классов, так что если вы говорите о встроенных типах данных (по ссылке вваш вопрос) тогда static_cast это то, что вы должны использовать.

И, кстати, ссылки являются НЕ указателями.

1 голос
/ 14 августа 2011

Относительно первоначального вопроса «Так должен ли я получать bad_cast при приведении указателей?», №

Вот почему вы можете видеть конструкции типа

if( T* pT = dynamic_cast<T*>( p ) ) ...  // use pT in if body

Относительно нового вопроса «Является ли этоблок try-catch не подходит? ", нет, это блок try - catch для обнаружения ошибок выделения;это не относится к dynamic_cast как таковому.

Приветствия & hth.,

0 голосов
/ 14 августа 2011

Поскольку dynamic_cast<T*> не генерирует исключения, один из блоков try-catch совершенно не нужен.

Однако вы можете легко определить свою собственную функцию приведения, которая действительно выдает исключение для указателей.Это то, что я делаю в своем собственном коде (упрощенный код, и учтите, что я использую сборщик мусора, чтобы я мог без всяких последствий бросать указатели):

template <class Class, class Object>
inline Class* cast (Object* obj)
{
    Class* result = dynamic_cast<Class*>(obj);
    if( obj != null and result == null ){
        throw new ClassCastException(); //  unusual, throw bad_cast if you prefer
    }
    return result;
}

template <class Class, class Object>
inline const Class* cast (const Object* obj)
{
    const Class* result = dynamic_cast<const Class*>(obj);
    if( obj != null and result == null ){
        throw new ClassCastException(); //  unusual, throw bad_cast if you prefer
    }
    return result;
}

Кроме того, я также использую егосинтаксический сахар для static_cast, но это возможно только потому, что я не использую его для динамических ссылок и константных ссылок:

template <class Class, class Object>
inline Class cast (const Object& obj)
{
    return static_cast<Class>(obj);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...