2017-11-18 3 views
0

割り当ての場合、私はハッシュマップを実装しています。私のvalueOf()関数は、キーの値を見つけて関数に出力しても、メインでガーベジを返しています。私は2つの可能な解決策を見つけましたが、どちらも私の場合には適していません。C++テンプレートポインターベースの変数は、保存して出力する前にガベージを返します。

クラス概要:

ハッシュテーブル

template <typename V> 
class HashTable { 
private: 
    string m_key; 
    V m_value; 
... 

MyStringMap

template <typename V> 
class MyStringMap : public AbstractStringMap<V> { 
private: 
    HashTable<V> * m_table; 
    int m_maxSize; 
    int m_currSize; 
    string EMPTY_KEY; 
    string TOMB_KEY; 
... 

そして(MyStringMapである)問題機能:

const V& valueOf(const string& key) const throw (Oops) { 
    int home; 
    int pos = home = hash(key); 

    // stops at found key (for success) or empty key (for failed) 
    for (int i = 1; (key != m_table[pos].getKey()) && (EMPTY_KEY != m_table[pos].getKey()); i++) 
     pos = (home + probe(key, i)) % m_maxSize; 

    // check found pos and return accordingly 
    if (key == m_table[pos].getKey()) { 
     return m_table[pos].getValue(); 
    } 
    else 
     throw Oops("Key Not Found!!"); 
} 

上記のreturn m_table[pos].getValue();部分は、メインで出力してプログラムをクラッシュさせるときにゴミを返すようになっています。ただし、戻り値の前に関数内にcout << "FOUND [" << m_table[pos].getKey() << "] [" << m_table[pos].getValue() << "]" << endl;があると、正しい値が表示されます。

私がメインでそれを実行している方法は次のとおりです。

try { 
    cout << "Person1? " << thelist.valueOf("Person1") << endl; 
    cout << "Person2? " << thelist.valueOf("Person2") << endl; 
} catch (Oops e) { 
    cout << e.getMsg() << endl; 
} 

私が見つけた2つのソリューションが、適切ではないが、次のとおりです。

  • はの終わりにc_str()を追加は機能:メイン:Ex:cout << "Person1? " << thelist.valueOf("Person1").c_str() << endl;。私はメインを編集できないので(割り当てが指示するように)、私はこれを使うことはできません。
  • 変数の代わりに、直接値を戻し、そこに出力し、それを持つ、例:何らかの理由で

V found = m_table[pos].getValue(); cout << "FOUND [" << m_table[pos].getKey() << "] [" << found << "]" << endl;

、これはリターンが正しい非ゴミ値を表示します。しかし、そのハックな解決策と私は余分な出力を望んでいません。


ご協力いただければ幸いです。私はこれがおそらく意味をなさないと確信しているので、必要な箇所を明確にします。

+0

[mcve]をご覧ください。以下のサムの答えはまともであるという妥当なオッズを持っていますが、どうしてでしょうか? – user4581301

答えて

0

私はあなたのgetValue()メソッドがVオブジェクトを返すと推測しています。そのオブジェクトはスタックに作成されます。その後、そのオブジェクトへの参照を返します。その後、スタックはあなたのコンピュータで何か他のものによって上書きされ、あなたはゴミを取得します。これはまた、オブジェクトを返すことがなぜ機能するのかを説明します:それはメモリ空間に割り当てられ、上書きされません。

つまり、スタック上のオブジェクトへの参照を返しています。後で読むときにそのアドレスに何があるのか​​分からないので、あなたはそれを行うことはできません。

+0

値を正しく返す方法は何ですか?それを変数に代入してその変数を返すのは、mainの戻り値に.c_str()を追加しない限り、まだガベージが発生します。 – huhn

関連する問題