Если вы включите свои предупреждения, вы увидите, что вы не всегда возвращаетесь с findPerson
. В этой функции
Person& findPerson(Person& root, string child_name){
if (root.name.compare(child_name) != 0)
{
cout<<root.name<<":1"<<endl;
findPerson(*root.father, child_name); // (1)
}
else if(root.name.compare(child_name) == 0){
cout<<root.name<<":2"<<endl;
return root;
}else{
cout<<"not found!!!"<<endl;
Person p("no found");
return p; // (2)
}
}
Код в первом if
-ветвлении, отмеченном (1)
, должен возвращать рекурсивно найденного персонажа, например:
return findPerson(*root.father, child_name);
. позаботьтесь о segfault.
Однако в последней ветви этой функции есть более глубокая проблема, когда вы возвращаете ссылку на локальную переменную p
, помеченную (2)
. Если вы сделаете это, вы вернете висячую ссылку, поскольку p
будет go выходить из области действия при возврате функции.
Вам нужно подумать о том, что должна делать эта функция, если не найдено Person.
Возможно, вы можете вернуть Person*
, поэтому nullptr
означает, что никого не найдено.
Вы можете вернуть std::optional<Person>
,