2015-10-15 181 views
0

我想重載我的類中的下標運算符[],它使用鏈表創建一個映射。這和幾個變化,如添加const,就是我所嘗試過的。C++ overload []運算符

int& operator[](std::string key); 

然後定義在一個單獨的文件

int& mapLL::operator[](std::string key){ 
    int val = this->get(key); 
    return val; 
} 

這個過載是我不知道如何解決

main.cpp: In function ‘int main()’: 
main.cpp:38:24: error: invalid types ‘mapLL*[const char [4]]’ for array subscript 
int a = list3["ghi"]; 
        ^
mapLL.cpp: In member function ‘int& mapLL::operator[](std::string)’: 
mapLL.cpp:110:9: warning: reference to local variable ‘val’ returned [-Wreturn-local-addr] 
    int val = this->get(key); 
    ^

然後在錯誤主要文件我正在嘗試這個

mapLL *list3 = new mapLL(); 
list3->set("abc",1); 
list3->set("def",2); 
list3->set("ghi",3); 
list3->set("jkl",1); 
list3->toString(); 
cout << list3->get("ghi") << endl; 
int a = list3["ghi"]; 
cout << a << endl; 
delete list3; 

get函數

int mapLL::get(std::string key){ 
    bool found = false; 
    node *me = (node *) first; 
    if(is_empty()){ 
     return -2; 
    } 
    while(!found){ 
     if (me->getKey() == key){ 
      return me->getValue(); 
     }else{ 
      if (me->getNext() == 0){ 
       return -1; 
      }else{ 
       me = (node *) me->getNext(); 
      } 
     } 
    } 
} 
+0

它看起來像'list3'是一個指針,所以你就必須做'(*項目list3) 「GHI」]' – Brian

+0

此外,由於編譯器警告你該方法返回一個臨時引用。這絕對不是你想要做的。 – Jon

+0

是否有理由需要使用動態內存分配(例如,新操作符)?這不是Java或C#。你可以將'list3'聲明爲不帶'new'的局部變量或全局變量。 –

回答

1

我建議不要使用原始指針和動態分配。你的問題源於不正確使用指針。

使用直接聲明:

mapLL list3; 
list3.set("abc",1); 
list3.set("def",2); 
list3.set("ghi",3); 
list3.set("jkl",1); 
list3.toString(); 
cout << list3.get("ghi") << endl; 
int a = list3["ghi"]; 
cout << a << endl; 
+0

@cmb ^^^ ^這是要走的路^^ –

+0

他仍然返回一個指向本地引用的指針。 –

4
int& mapLL::operator[](std::string key){ 
    int val = this->get(key); 
    return val; 
} 

要返回一個局部變量,val參考。
你實際上需要做的是找到你鏈接列表中的元素,並按原樣返回它,沒有賦值給中間的局部變量。

另外,list3指針,不幸的是,你需要取消對它的引用使用[]操作前:

(*list3)["ghi"]; 

都已經被說+在看您的個人資料,我得到你來自一個Java背景。我的建議 - 瞭解堆棧分配和分配之間的區別。這是該語言的基礎。您需要使用動態分配的對象(=使用new)很少。

儘管Java隱藏了分配細節,但這也許是C++中最重要的主題之一。不是每件事都必須是一個指針。你的出發點是堆棧分配的對象。如果它不符合您的需求,則從那裏轉到動態/靜態分配。

+0

我的原創思路是這個'return this-> get(key)',但它給了我這個錯誤'類型'int'的類型'int&'的非const引用的無效初始化' – cmb