Ваше понимание в основном верно. Я опишу это утверждение за заявлением
в несколько более точных терминах.
double Statement::findValue(char* id) {
IdNode tmp(id);
Это создает переменную с именем tmp
с использованием переданной строки. (Что ж, я предполагаю, что id
- это строка. В Си обычно передают указатель на начало массива символов с нулевым символом в конце, когда Вы хотите передать строку. В C ++ то же самое было обычным делом, но теперь оно становится менее распространенным, когда в стандартной библиотеке есть лучшие типы строк и диапазонов. Но не каждая строка char *
является строкой. Это может быть просто указатель на один символ. Здесь, однако, сильный контекст предполагает, что это строка.)
list<IdNode>::iterator i = find(idList.begin(), idList.end(), tmp);
Использует алгоритм std::find
для поиска диапазона элементов от начала idList
до конца для элемента, равного tmp
.
Обратите внимание, что idList.end()
- это итератор, который указывает фактический конец списка, а не последний элемент в списке. Вы можете думать об этом как об одном элементе за последним элементом в списке. Диапазоны итераторов (и индексы массивов) в C и C ++ обычно включают первое значение и исключают второе. Таким образом, find
начнется с первого элемента и продолжится до до (но не до конца) конца списка.
Здесь не показано, но я предполагаю, что есть перегрузка для operator==(const idNode &, const idNode &)
, которая возвращает true, если имена двух idNodes
совпадают, независимо от того, совпадают ли поля значений.
Если в диапазоне нет совпадений, то std::find
вернет конечный итератор. Если есть совпадение, он вернет итератор, который ссылается на соответствующий элемент. Итак ...
if (i != idList.end())
return i->value;
else
issueError("Unknown variable");
Возвращает поле значения совпадения (если оно есть) или вызывает issueError
, если его нет.
return 0;
}
В последнем случае, если issueError
возвращает и не завершает программу или не генерирует исключение, функция вернет значение 0 (которое, поскольку тип возвращаемого значения является двойным, будет неявно преобразовано в 0.0 ).
processNode
практически идентичен, за исключением того, что он устанавливает значение в найденном узле, а не возвращает его.