C++ c++;重载[]运算符

C++ c++;重载[]运算符,c++,operator-overloading,subscript,C++,Operator Overloading,Subscript,我试图在我的类中重载下标运算符[],该类使用链表创建映射。这和几个变体,比如添加const,就是我所尝试的 标题 int& operator[](std::string key); 然后在一个单独的文件中定义重载 int& mapLL::operator[](std::string key){ int val = this->get(key); return val; } 这就是我不知道如何修复的错误 main.cpp:在函数“int main()”中:

我试图在我的类中重载下标运算符[],该类使用链表创建映射。这和几个变体,比如添加const,就是我所尝试的

标题

int& operator[](std::string key);
然后在一个单独的文件中定义重载

int& mapLL::operator[](std::string key){ 
   int val = this->get(key);
   return val;
}
这就是我不知道如何修复的错误

main.cpp:在函数“int main()”中:
main.cpp:38:24:错误:数组下标的类型“mapLL*[const char[4]]”无效
int a=列表3[“ghi”];
^
mapLL.cpp:在成员函数“int&mapLL::operator[](std::string)”中:
mapLL.cpp:110:9:警告:对局部变量“val”的引用返回[-Wreturn local addr]
int val=此->获取(键);
^
然后在主文件中,我尝试这个

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;
您正在返回对局部变量的引用,
val

您实际上需要做的是在链表中找到元素并按原样返回,中间不分配局部变量

另外,
list3
是一个指针,不幸的是,您需要在使用
[]
运算符之前取消对它的引用:

(*list3)["ghi"]; 
大家都说了+看看你的个人资料,我知道你有Java背景。我的建议-了解堆栈分配和堆分配之间的区别。这是语言的基础。您很少需要使用动态分配的对象(=使用
new

虽然java隐藏了分配细节,但这可能是C++中最重要的主题之一。并非所有的东西都必须是指针。您的起点是堆栈分配的对象。如果动态/静态分配不符合您的需要,请从那里转移到动态/静态分配

您正在返回对局部变量的引用,
val

您实际上需要做的是在链表中找到元素并按原样返回,中间不分配局部变量

另外,
list3
是一个指针,不幸的是,您需要在使用
[]
运算符之前取消对它的引用:

(*list3)["ghi"]; 
大家都说了+看看你的个人资料,我知道你有Java背景。我的建议-了解堆栈分配和堆分配之间的区别。这是语言的基础。您很少需要使用动态分配的对象(=使用
new


虽然java隐藏了分配细节,但这可能是C++中最重要的主题之一。并非所有的东西都必须是指针。您的起点是堆栈分配的对象。如果动态/静态分配不符合您的需要,请从这里转到动态/静态分配。

我建议不要使用原始指针和动态分配。您的问题源于指针的不正确使用

使用直接声明:

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;
mapllist3;
列表3.集合(“abc”,1);
列表3.set(“def”,2);
列表3.set(“ghi”,3);
列表3.set(“jkl”,1);
列表3.toString();

cout我建议不要使用原始指针和动态分配。您的问题源于指针的不正确使用

使用直接声明:

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;
mapllist3;
列表3.集合(“abc”,1);
列表3.set(“def”,2);
列表3.set(“ghi”,3);
列表3.set(“jkl”,1);
列表3.toString();

是否看起来
list3
是一个指针,因此您必须执行
(*list3)[“ghi”]
。此外,编译器警告您,该方法返回对临时变量的引用。这绝对不是您想要做的。您是否有理由需要使用动态内存分配(例如,operator new)?这不是Java或C。您可以将
list3
声明为局部或全局变量,而不必使用
new
@Brian我刚刚尝试了您的建议,效果很好。有没有办法重写函数,使
list3[“ghi”]
works@cmb不要将
list3
声明为指针。它不需要是一个。它看起来像是一个指针,
list3
,因此您必须执行
(*list3)[“ghi”]
。此外,当编译器警告您时,该方法会返回对临时变量的引用。这绝对不是您想要做的。您是否有理由需要使用动态内存分配(例如,operator new)?这不是Java或C。您可以将
list3
声明为局部或全局变量,而不必使用
new
@Brian我刚刚尝试了您的建议,效果很好。有没有办法重写函数,使
list3[“ghi”]
works@cmb不要将
list3
声明为指针。我最初的想法是这样的
返回这个->获取(键)
,但它给了我一个错误
从类型为“int”的右值初始化类型为“int&”的非常量引用无效
我最初的想法是这样的
返回这个->获取(键)
但是它给了我这个错误
从类型为“int”的右值初始化类型为“int&”的非常量引用无效。
@cmb^^^^^^^^^^^^^^这是要走的路^^^