クラス内で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