class Person {
private:
char* name;
int numChildren;
Person** childrenList;
public:
Person(char* name);
~Person();
// member functions
// ...
};
假设我通过以下代码创建
Person
:Person* me = new Person("Alex");
,还将创建Alex
的后代对象。对于特定实例,结构将如下所示:
我想实现一个函数const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const;
,该函数搜索所有Person
来查找一个name
等于target_name
的函数。
这是我的代码:
const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const {
if (strcmp(thisPerson->name(), target_name) == 0)
return thisPerson;
for (int i = 0; i < thisPerson->numChildren(); i++)
findPerson(thisPerson->childrenList[i], target_name);
}
我认为代码可以工作,但是编译器认为它可能什么也不返回,也不让我编译它。而且,如果找不到任何人,我也不知道如何返回nullptr
。
答案 0 :(得分:3)
您需要:
return
(如果成功)的递归调用结果return nullptr
(如果找不到此人)const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const {
if (strcmp(thisPerson->name(), target_name) == 0)
return thisPerson;
for (int i = 0; i < thisPerson->numChildren(); i++) {
const Person *p = findPerson(thisPerson->childrenList[i], target_name);
// Found in child tree? Return it (terminate recursion)
if (p) return p;
}
// Not found in this branch of the tree
return nullptr;
}
尽管将Person
指针传递给Person
成员函数似乎有些奇怪。另外,numChildren
和name
是成员变量,而不是函数。
应该不是:
const Person* Person::findPerson(const char* target_name) const {
if (strcmp(name, target_name) == 0)
return this;
for (int i = 0; i < numChildren; i++) {
const Person *p = childrenList[i]->findPerson(target_name);
// Found in child tree? Return it (terminate recursion)
if (p) return p;
}
// Not found in this branch of the tree
return nullptr;
}
而且,我不得不问为什么不使用std::vector
和std::string
而不是数组和char指针?