2015-10-15 88 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