2016-10-26 46 views
-2

我有一个示例Map类,我试图覆盖下标运算符。允许该类的用户读取和写入地图。 正在读取Map [“a”],并且Map [“a”] =“something”是类的写入。然而,我无法弄清楚如何使用赋值操作符的一面,并允许一个传入的值来替换它。现在,如果我尝试赋一个新值,它只是写着“分段错误”重载下标运算符

这是我到目前为止有:

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只是定义为字符串,每个键都有一个与其相关的值。

+0

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

初看。运营商应该采用'type'而不是'Map'的权利?因为'Map [a]'会返回地图中的一个元素。不是地图。除非它是地图的地图。 –

+1

运算符=分配整个地图,而不是单个元素。 –

回答

3

您不是分配给地图,而是分配给由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版本。

+0

哇,这使得很多感......没有返回一个对象来分配!谢谢! –