2017-12-08 3 views
-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 
+1

マップに格納されている 'Foo&'参照はすべて、ローカル変数を参照しています。 –

+0

私の質問を編集しました。ありがとうございます。 – binaryBigInt

答えて

0
BarBar bar(dat); 

      insert('^',bar); //error "Invalid arguments 'Candidates are:void insert(char, Foo *)'" 

:で

プログラムがクラッシュあなたがそれを使う時までに)。

マップは実際にこの問題の正しい構造ではなく、順序統計木を検索し、並べ替えなしで並べ替えを提供します。すなわち、OSツリーは 'o'、 'h'を 'h'、 'o'のように簡単に格納できます。

関連する問題