2016-10-26 84 views
-2

我有一個示例Map類,我試圖覆蓋下標運算符。允許該類的用戶讀取和寫入地圖。 正在讀取Map [「a」],並且Map [「a」] =「something」是類的寫入。然而,我無法弄清楚如何使用賦值操作符的一面,並允許一個傳入的值來替換它。現在,如果我嘗試賦一個新值,它只是寫着「分段錯誤」重載下標運算符

這是我到目前爲止有:

VALUE_TYPE& Map::operator[](KEY_TYPE a){ 
    cout << "hmm" << endl; 


} 



Map& Map::operator=(const Map &rhs){ 
    //cout << "operator = " << endl; 
} 

現在我沒有任何代碼..只是想看到他們會成功接到電話。

似乎我無法搞清楚的是,如果我做的

Map["a"] = "hey"; 

這樣的東西,我會得到一個分段錯誤。我假設賦值運算符=會在我想爲特定鍵分配新值時被調用。難道我做錯了什麼?

順便說一句,VALUE_TYPE和KEY_TYPE只是定義爲字符串,每個鍵都有一個與其相關的值。

+0

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

初看。運營商應該採用'type'而不是'Map'的權利?因爲'Map [a]'會返回地圖中的一個元素。不是地圖。除非它是地圖的地圖。 –

+1

運算符=分配整個地圖,而不是單個元素。 –

回答

3

您不是分配給地圖,而是分配給由operator[]返回的對象。
(在m["a"] = "hey";m["a"]不是Map,這是一個VALUE_TYPE&。)

運營商需要返回一個有效的對象的引用,否則該行爲是不確定的。

我可以拿出最小的例子:

struct Mapp 
{ 
    int& operator[](int i) { return member; } 
    int member; 
}; 

int main() 
{ 
    Mapp m; 
    m[0] = 12; // Assigns 12 to m.member 
} 

你也想超負荷運營商的const版本。

+0

哇,這使得很多感......沒有返回一個對象來分配!謝謝! –