В моей программе у меня есть базовый класс (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
в остальной части моей программы, чтобы узнать тип объекта, и он работал правильно.
Почему это происходит?
Заранее спасибо.
возможности: http://stackoverflow.com/questions/278429/what-could-cause-a-dynamic-cast-to-crash – LeleDumbo
Если вы находитесь внутри первого оператора if, это означает, что кастинг завершился неудачно и shp вероятно, ищет некоторые недопустимые значения. Следовательно, вторая попытка dynamic_cast shp (которая, скорее всего, в недопустимом состоянии) приведет к сбою. Вам необходимо разместить больше кода для дальнейшего уточнения. – jazaman
'map [i] [j] -> getShip()' Вы на 100% уверены, что i и j действительны и вы не выходите из границ карты? Я предполагаю, что карта является 2-мерным массивом. – drescherjm