gpt4 book ai didi

c++ - 实现家族树时的C++核心转储错误

转载 作者:行者123 更新时间:2023-12-01 14:43:07 24 4
gpt4 key购买 nike

我正在尝试实现家谱。我定义了PersonTree类,如下所示:

文件FamilyTree.hpp:

using namespace std;
#include <string>

namespace family{

class Person{
public:
string name;
Person* mother;
Person* father;

Person(string name);

};

class Tree{
public:
Person* root;

Tree(string name);

Tree& addFather(string name1, string name2);
Tree addMother(string name1, string name2);
void display();
string relation(string name);
string find(string name);
void remove(string name);
};

};

文件FamilyTree.cpp:
#include "FamilyTree.hpp"
#include <string>
#include <iostream>
using namespace family;

// FUNCTIONS

Person& findPerson(Person& root, string child_name){
if (root.name.compare(child_name) != 0)
{
cout<<root.name<<":1"<<endl;
findPerson(*root.father, child_name);
}
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;
}
}

// PERSON
family::Person::Person(string person_name){
name = person_name;
father = nullptr;
mother = nullptr;
};

// TREE
family::Tree::Tree(string name){
root = new Person(name);
};

family::Tree& Tree::addFather(string child, string father){
Person& child_found = findPerson(*root, child);

//cout<<"child_found.name:"<<child_found.name<<endl;
child_found.father = new Person(father);
return *this;
};

family::Tree family::Tree::addMother(string name1, string name2){return Tree("");};
void family::Tree::display(){};
string family::Tree::relation(string name){return "";};
string family::Tree::find(string name){return "";};
void family::Tree::remove(string name){};

int main(){
Tree t("X");

t.addFather("X", "Y");
t.addFather("Y","Z");
return 0;
}

我从 addFather()函数开始: addFather("child", "new father")用于为现有 child 添加新父亲。
我使用 findPerson()函数递归实现了该函数,该函数返回子项的 Person对象和 addFather()函数,以创建新的 Person并将其初始化为找到的子项。

添加两个父亲后,我得到非法指令(核心转储)错误,这应该是什么问题?

最佳答案

如果您打开警告,则会看到您并不总是从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 -branch中的代码标记为 (1),需要返回以递归方式找到的Person,如下所示
return findPerson(*root.father, child_name);

那应该照顾到segfault。

但是,此函数的最后一个分支存在更深的问题,即您返回对标记为 p的局部变量 (2)的引用。如果这样做,您将返回一个悬空引用,因为当函数返回时, p将超出范围。

您需要考虑如果找不到“人员”时该功能应该做什么。
  • 您也许可以返回Person*,所以nullptr表示未找到任何人。
  • 您可以返回std::optional<Person>
  • 关于c++ - 实现家族树时的C++核心转储错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61044069/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com