繁体   English   中英

C ++重载[]运算符

[英]c++ overload [] operator

我试图重载我的类中的下标运算符[],该运算符使用链接列表创建地图。 我尝试过这种方法和几种变化,例如添加const。

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;
}

您正在返回对局部变量val的引用。
您真正需要做的是在链表中找到该元素,并按原样返回它,而在它们之间没有分配给局部变量。

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

(*list3)["ghi"]; 

所有人都在说+查看您的个人资料,我知道您来自Java背景。 我的建议-了解堆栈分配和分配之间的区别。 这是语言的基础。 您很少需要使用动态分配的对象(= using 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM