在相關說明中,operator[](const Key& key)
的一個問題是,如templatetypedef所述,爲了返回引用,它需要爲非const。
要擁有一個const訪問器,您需要一個可以返回失敗案例值的方法。在STL中,這是通過使用find()
來完成的,迭代器的使用和end()
表示失敗。
另一種方法是返回一個指針,其中null指示失敗。這在默認構建的記錄毫無意義的情況下可能是合理的。這也可以用數組運算符來完成:
Record* MyDictionary::operator[] (const string& keyToFind) const
{
for (int i = 0; i < used; ++i)
{
if (Records[i].Key == keyToFind)
{
return &Records[i];
}
}
return 0;
}
當然是有一種觀點認爲,應該operator[]
返回一個參考。在這種情況下,您最有可能實施find()
,並在其中實施operator[]
。
要實現find(),你需要定義一個迭代器類型。方便的類型將取決於實施。例如,如果Records []是普通的舊數組:
typedef Record* iterator;
typedef const Record* const_iterator;
const_iterator MyDictionary::end()const
{
return Records + used;
}
const_iterator MyDictionary::begin() const
{
return Records;
}
const_iterator MyDictionary::find(const string& keyToFind) const
{
for (iterator it = begin(); it != end(); ++it)
{
if (it->Key == keyToFind)
{
return it;
}
}
return end();
}
「看起來不起作用」是什麼意思?什麼是「記錄」,「記錄[i]」,「鑰匙」和「使用」?你有沒有考慮過僅僅使用'std :: map',它提供'SortedDictionary'-like功能,或'std :: unordered_map'(如果你的實現提供了它),它提供'Dictionary'-like功能? – 2011-02-24 01:48:32
如果你要寫這樣一個運算符,最好將const加入參數:'Record&MyDictionary :: operator [](const string&_Key)'。 – 2011-02-24 01:57:08
除了Ted的評論,如果沒有const限定符,則執行以下操作將是非法的:'Array [「myString」];'因爲您不能引用臨時對象。不知道我是否正確解釋,我剛剛學到了。 – Marlon 2011-02-24 02:50:33