C++ c++;重载[]运算符
我试图在我的类中重载下标运算符[],该类使用链表创建映射。这和几个变体,比如添加const,就是我所尝试的 标题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()”中:
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
)
val
。
您实际上需要做的是在链表中找到元素并按原样返回,中间不分配局部变量 另外,
list3
是一个指针,不幸的是,您需要在使用[]
运算符之前取消对它的引用:
(*list3)["ghi"];
大家都说了+看看你的个人资料,我知道你有Java背景。我的建议-了解堆栈分配和堆分配之间的区别。这是语言的基础。您很少需要使用动态分配的对象(=使用new
)
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^^^^^^^^^^^^^^这是要走的路^^^