时间:2019-03-08 标签:c++overload[]operator
c++ overload [] operator
我正在尝试重载我的 class 中的下标运算符 [],它使用链表来创建地图。这个和几个变体,比如添加 const,是我尝试过的。
header
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;
获取函数
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();
}
}
}
}
int& mapLL::operator[](std::string key){
int val = this->get(key);
return val;
}
您正在 return 引用局部变量 val
。
你真正需要做的是在你的链表中找到元素,return 它是,中间没有分配给局部变量。
此外,list3
是一个 指针 ,不幸的是,您需要在使用 []
运算符之前取消引用它:
(*list3)["ghi"];
都说了 + 查看你的个人资料,我知道你来自 Java 背景。我的建议 - 了解 stack 分配和 heap 分配之间的区别。这是语言的基础。您很少需要使用动态分配的对象(=使用 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;
我正在尝试重载我的 class 中的下标运算符 [],它使用链表来创建地图。这个和几个变体,比如添加 const,是我尝试过的。
header
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;
获取函数
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();
}
}
}
}
int& mapLL::operator[](std::string key){
int val = this->get(key);
return val;
}
您正在 return 引用局部变量 val
。
你真正需要做的是在你的链表中找到元素,return 它是,中间没有分配给局部变量。
此外,list3
是一个 指针 ,不幸的是,您需要在使用 []
运算符之前取消引用它:
(*list3)["ghi"];
都说了 + 查看你的个人资料,我知道你来自 Java 背景。我的建议 - 了解 stack 分配和 heap 分配之间的区别。这是语言的基础。您很少需要使用动态分配的对象(=使用 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;