Итак, я вижу три другие проблемы в коде, кроме возврата адреса локальной переменной, на которую указал Адам Розенфилд.
Во-первых, ваша функция восстановления никогда не закончится. В какой-то момент в recurse () вы должны проверить значение, которое не вызывает повторного вызова recurse () и просто возвращает. Это фундаментальная часть рекурсии. Переданный аргумент, v1, также не используется.
Во-вторых, оператор + () на самом деле не работает. Невозможно назначить int для объекта Number ().
В-третьих, в main вы передаете то, что называется result, который никогда не объявляется.
Забывая об этих ошибках, я предполагаю, что вы хотите разместить все объекты в куче, чтобы избежать переполнения стека, когда эта функция будет повторяться много раз или фактический используемый объект будет намного больше, чем Number. В этом случае, размещая возвращаемую переменную в куче внутри recurse (), вы заставляете вызывающую сторону удалить возвращаемый объект. Поэтому после вызовов recurse () в recurse () и main () вам придется удалить возвращаемое значение. Соглашение о том, чтобы указать это вызывающей стороне, должно возвращать указатель вместо ссылки. Поэтому recurse () и main () будут выглядеть примерно так:
Number* recurse(const Number& v1) {
Number* result = new Number();
Number one;
if(v1.value >= 2) {
Number temp;
temp.value = v1.value - 1;
Number* partialResult = recurse( temp ); //capture the object to delete
*result = *partialResult + one;
delete partialResult; //delete the object
}
return result;
}
int main() {
Number result;
result.value = 15;
Number *answer;
answer = recurse(result);
delete answer;
}
Примечание: все, что вычисляет рекурсор, бессмысленно. Я не знаю, каковы намерения, но это просто то, что работает.