重载下标操作符

Overloading subscript operator

本文关键字:操作符 下标 重载      更新时间:2023-10-16

我有一个示例Map类,我试图覆盖下标操作符。允许类的用户读取和写入Map。Map["a"]为读,Map["a"]="某物"为类的写。然而,我不知道如何使用赋值操作符,并允许传入值来替换它。现在,如果我尝试分配一个新值它只会读取"segmentation fault"

到目前为止我写的是:

VALUE_TYPE& Map::operator[](KEY_TYPE a){
    cout << "hmm" << endl;

}

Map& Map::operator=(const Map &rhs){
    //cout << "operator = " << endl;
}

现在我没有任何代码…只是想看看他们会被成功调用。

我似乎不明白的是,如果我做了诸如

Map["a"] = "hey";

我将得到一个分割错误。我假设当我想为一个特定的键分配一个新值时,将调用赋值操作符=。我做错了什么吗?

顺便说一下,VALUE_TYPE和KEY_TYPE只是定义为字符串,每个键都有一个与之关联的值

你不是在给map赋值,而是给operator[]返回的对象赋值。
(在m["a"] = "hey";中,m["a"]不是Map,而是VALUE_TYPE&)

操作符需要返回对有效对象的引用,否则行为未定义。

我能想到的最小的例子:

struct Mapp
{
    int& operator[](int i) { return member; }
    int member;
};
int main()
{
    Mapp m;
    m[0] = 12; // Assigns 12 to m.member
}

还需要重载const版本的操作符