-2
各ノードが単一のキャラクターを表すツリーを作成したいと思います。リーフノードは、このリーフノードにつながる文字によって作成された文字列を表します。私のアプローチ(多分クラス名はビットmissleadingあり、これはただ速いプロトタイプで、fooはバーがリーフノードノードとバルバルで、基本クラスである):C++ - マップを使ってツリーを再帰的に作成
私の予想出力は次のようになりclass Foo{
public:
virtual void print() = 0;
};
class BarBar : public Foo {
public:
BarBar(int mData) : data(mData){};
int data;
void print(){
cout << data << endl;
}
};
class Bar : public Foo {
public:
map<char,Foo*> ptr;
void insert(char c, Foo* f){
ptr.insert(pair<char,Foo*>(c,f));
}
void procStr(char* str, int dat){
if(str[0] != '\0'){
Bar b;
insert(str[0],b); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
str++;
b.procStr(str,dat);
} else {
BarBar bar(dat);
insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'"
}
}
void print(){
for (auto& kv : ptr){
cout << kv.first << endl;
kv.second->print();
}
}
}
int main(){
Bar root;
root.procStr("Hello",42);
root.print();
return 0;
}
:
H
e
l
l
o
しかし、その代わりに、私は得る:
H
Ä
とプログラムがクラッシュを。あなたの関数がfoo *を取りますが、あなたはその時まだローカルインスタンス(インスタンスを渡しているので、あなたは&バーを通過した場合でも、それは無効になります
Foo& res = kv.second;
res.print(); //<<-- Program crashes
マップに格納されている 'Foo&'参照はすべて、ローカル変数を参照しています。 –
私の質問を編集しました。ありがとうございます。 – binaryBigInt