클래스에서 std::vector
을 사용하여 다중 방향 트리를 구현하려고합니다.벡터의 push_back() 함수를 사용하면 요소가 사라지는 이유
회원의 자녀를 추가 할 때마다 addMember
함수를 사용합니다. 이 프로그램을 디버깅하기 위해 VS2017을 사용하고 있습니다. 이 함수 범위에서 부모 자식 벡터는 실제로 요소를 push_back()
까지 추가하지만 함수를 종료 한 후에 벡터 주소가 변경되고 내가 추가 한 요소가 사라집니다.
여기 내 코드입니다 :
#include <iostream>
#include<string>
#include<vector>
using namespace std;
class member {
public:
string name;
member* parent;
vector<member*> children;
member(string m_name,member* m_parent):name(m_name),parent(m_parent){}
};
class familyTree {
private:
member ancestor;
public:
member* getAncestor() { return &ancestor; }
familyTree(member& m_ancestor):ancestor(m_ancestor){}
member* searchMember(string name,member* node,bool& flag);
void addMember(string name, int children_number,vector<string>& children_name);
};
member* familyTree::searchMember(string name, member* node,bool& flag) {
member* find = NULL;
if (node) {
if (node->name == name)
find = node;
else {
if (!flag) {
for (auto iter = node->children.begin(); iter != node->children.end(); iter++) {
find = searchMember(name, *iter, flag);
if (flag)
break;
}
}
}
}
return find;
}
void familyTree::addMember(string name,int children_number,vector<string>& children_name) {
bool flag = false;
member* parent = searchMember(name, getAncestor(), flag);
for (auto i : children_name) {
member* child = new member(i,parent);
parent->children.push_back(child);
}
}
당신은'addChild()'라는 메서드가 없습니다. 'addMember()'를 원하셨습니까? 사람들이 이해할 수 있도록 일관된 질문을하십시오. 또한, 당신은 정말로 그 '신입 회원'을 어딘가에서 지울 것이라고 생각합니까? 그러면 "벡터의 주소가 바뀌고 내가 추가 한 요소가 사라질 것입니다"라는 것을 무엇을 의미합니까? 테스트의 예와 기대 한 결과를 보여줄 수 있습니까? –
Thx, 고쳐 봤습니다. 필자가 작성한 함수는 결코 삭제하지 않습니다. 단일 단계 디버그 모델에서는 새 멤버가 벡터에 추가되었지만 addMember 함수를 종료하면 해당 멤버의 주소가 내가 방금 조작 한 벡터가 변경되고 그 안에있는 요소가 지워집니다. – Dinghow
젠장, 그게 잘 exe에서 발견, 요소가 사라지지 않을 것이지만, 만약 내가 단일 단계 디버그 모델을 사용하면 그렇게 할 것입니다. – Dinghow