2015-01-07 4 views
0

В моей программе у меня есть базовый класс (ship) и четыре производных классов (pirate, mercantile, repairing, exploring) и в функции члена repairing Я хочу знать, если объект указывал на ship * является типа pirate, чтобы иметь возможность обрабатывать этот случай.dynamic_cast разбивает мою программу

Так что в функции члена у меня есть следующие if:

ship * shp; 

shp = map[i][j]->getShip(); //random initialization of shp 

if((dynamic_cast<pirate *>(shp)) == NULL) // <- program doesn't enter here 
{ . . . }         //  while it should 

Но во время выполнения, я заметил, что иногда программа не вошла в if даже когда shp указывал на не- pirate объекта (например, exploring).

Так что я попытался увидеть результат этого boolean значения внутри if, написав следующий код:

pirate *prt; 
bool test; 
if(map[i][j]->getShip()!=0){ 
    prt = dynamic_cast<pirate *>(shp); // <- program crashes here 
    test = (prt == NULL); 
    cout<<test<<endl; 
} 

Но после компиляции и пытается запустить это, программа выходит из строя как раз в то время dynamic_cast используется ,

Таким образом, возможно, dynamic_cast не работает правильно, и по этой причине он не вводит if в предыдущем коде.

Обратите внимание, что я использовал тот же метод с dynamic_cast в остальной части моей программы, чтобы узнать тип объекта, и он работал правильно.

Почему это происходит?

Заранее спасибо.

+0

возможности: http://stackoverflow.com/questions/278429/what-could-cause-a-dynamic-cast-to-crash – LeleDumbo

+0

Если вы находитесь внутри первого оператора if, это означает, что кастинг завершился неудачно и shp вероятно, ищет некоторые недопустимые значения. Следовательно, вторая попытка dynamic_cast shp (которая, скорее всего, в недопустимом состоянии) приведет к сбою. Вам необходимо разместить больше кода для дальнейшего уточнения. – jazaman

+0

'map [i] [j] -> getShip()' Вы на 100% уверены, что i и j действительны и вы не выходите из границ карты? Я предполагаю, что карта является 2-мерным массивом. – drescherjm

ответ

0

Как вы уже выяснили, причина не была инициализирована ship. Более принципиально, dynamic_cast<Derived>(baseptr) требует, чтобы baseptr должен указать на объект Base или быть nullptr. Например. он не будет работать, если указатель был инициализирован, но объект затем удален.

Смежные вопросы