Функция конструктора для маршрута класса изначально содержала следующий код, который проверяет, существует ли элемент («gpx», «rte» и т. Д.) В файле. Который работает как надо.
if (! elementExists(source,"gpx"))
{
oss << endl << "no gpx tag";
constructorReport = oss.str();
constructorSucceeded = false;
return;
}
if (! elementExists(source,"rte"))
{
oss << endl << "no rte tag";
constructorReport = oss.str();
constructorSucceeded = false;
return;
}
Я попытался ввести функцию, чтобы заменить эти операторы if. Программа строит нормально.
void Route::constCheck(string source, string type)
{
if (! XML_Parser::elementExists(source, type))
{
std::ostringstream oss;
oss << std::endl << "no" << type <<" tag";
constructorReport = oss.str();
constructorSucceeded = false;
return;
}
}
Я изменил файл gpx, который он проверяет, чтобы вызвать ошибку, но с моей добавленной функцией он продолжает, как будто ошибки нет.
Любая помощь приветствуется, и, пожалуйста, дайте мне знать, если вам нужно больше информации. Я пытался держать код легким в соответствии с руководящими принципами.
В исходном коде вы возвращаетесь из функции в первый раз, когда один из тестов завершается неудачей, вы не продолжаете пробовать другие тесты.
Теперь, когда вы переместили тест в функцию, вызывающий не сможет узнать, провалился ли тест, поэтому он выполнит все из них и никогда не вернется из своей функции при сбое одного из них. Эта функция необходима для возврата логического значения, которое указывает, не удалось ли это сделать.
bool Route::constCheck(string source, string type)
{
if (! XML_Parser::elementExists(source, type))
{
std::ostringstream oss;
oss << std::endl << "no" << type <<" tag";
constructorReport = oss.str();
constructorSucceeded = false;
return false;
}
return true;
}
Тогда замена вашего исходного кода будет выглядеть так:
if (!constCheck(source, "gpx")) {
return;
}
if (!constCheck(source, "rte")) {
return;
}
Других решений пока нет …