割り当ての場合、私はハッシュマップを実装しています。私の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;
、これはリターンが正しい非ゴミ値を表示します。しかし、そのハックな解決策と私は余分な出力を望んでいません。
ご協力いただければ幸いです。私はこれがおそらく意味をなさないと確信しているので、必要な箇所を明確にします。
[mcve]をご覧ください。以下のサムの答えはまともであるという妥当なオッズを持っていますが、どうしてでしょうか? – user4581301