Я хотел сделать общую функцию, которая будет искать тип класса в узле и возвращает его адрес. Определяется ниже
SoNode* searchandgive(SoType searchtype, SoNode* searchnode)
{
SoSearchAction mysearch;
mysearch.setType(searchtype);
mysearch.setInterest(SoSearchAction::FIRST);
mysearch.apply(searchnode);
if (mysearch.getPath() == NULL) {
std::cout<<"No property of this type was found";
}
SoPath* mypath=mysearch.getPath();
return mypath->getTail();
}
Но когда я передаю тип поиска, такой как SoCoordinate3 :: getClassTypeId () и узел для поиска senode, как указано ниже:
SoCoordinate3 * mycoords=(SoCoordinate3*) searchandgive(SoCoordinate3::getClassTypeId(),senode);
const SbVec3f *s=mycoords->point.getValues(0);
std::cout<<" " <<s->getValue()[25]; // Some point
Но последняя строка генерирует ошибку необработанного исключения. Пожалуйста, расскажите, что я здесь делаю не так. Последняя строка действительна, поскольку то же самое, написанное внутри области действия функции, работает, но не здесь.
С этим вы стоите, что mysearch.getPath()
может быть нулевым:
if (mysearch.getPath() == NULL) {
std::cout<<"No property of this type was found";
}
но ниже вы используете это без какой-либо проверки:
SoPath* mypath=mysearch.getPath();
return mypath->getTail();
так что это может вызвать необработанное исключение.
Другой poitn это строка:
std::cout<<" " <<s->getValue()[25]; // Some point
Не проверяется, сколько точек находится в векторе, и это также может вызвать исключение.
Других решений пока нет …