почему эта ошибка происходит, когда я использую dynamic_cast? - PullRequest
0 голосов
/ 16 сентября 2018

Я хочу уменьшить объект, но это приводит к ошибке «not dynamic_cast». (источник не относится к типу класса)

в чем проблема ??

это мой код,

class A{...}

class B: public A{...}


A& x;
dynamic_cast<B&>(&x))!=0 //error here (source is not of class type)

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

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

class A{...}

class B: public A{...}


A& x;
if (dynamic_cast<B *>(&x))!=0)
    // cast was successful
else
    // cast wasn't successful

Вы также можете использовать ссылки везде, но если вы это сделаете,неудачное приведение передается с помощью исключения std::bad_cast:

void f(A &a) { 
    try {
        B &b = dynamic_cast<B &>(a);
        b.do_something_specific_to_b();
    }
    catch (std::bad_cast const &b) {
        // `a` wasn't of type `B`
    }
}

Обратите внимание, однако, что dynamic_cast в первую очередь полезен в таких случаях, когда вы получаете указатель / ссылку в качестве параметраили для таких вещей, как набор указателей, некоторые из которых могут указывать на различные типы:

std::vector<A *> objects;

for (auto const *a : objects) {
    B *b = dynamic_cast<B *>(a);
    if (b != nullptr)
        b->do_B_specific_stuff();
    else
        a->do_generic_A_stuff();
}

Наконец, я хотел бы отметить, что если вы часто используете dynamic_cast, шансы довольно великиХорошо, что ты делаешь что-то не так.Я использовал C ++ с тех пор, как существовал dynamic_cast, и за время его существования число раз, когда мне приходилось его использовать, вероятно, можно было подсчитать по пальцам одной руки (с оставшейся парой).Бывают времена и места, где это полезно (а в некоторых случаях это действительно важно), но они действительно довольно необычны.

0 голосов
/ 16 сентября 2018

Возможно только dynamic_cast тип класса для ссылки.

в чем проблема ??

Как сказано в сообщении об ошибке, результат выражения &x не является типом класса. Это тип указателя. Вы пытались dynamic_cast указатель на ссылку. Это невозможно.

...