在C++中重载[]运算符

Sea*_*ean 0 c++ dictionary operator-overloading map data-structures

我试图在c ++中重载[]运算符,以便我可以从我的数据结构中分配/获取值,就像在c#中使用字典一样:

数组["myString"] =等

这在c ++中是否可行?

我试图超载操作员,但它似乎没有工作,

Record& MyDictionary::operator[] (string& _Key)
{
for (int i = 0; i < used; ++i)
{
    if (Records[i].Key == _Key)
    {
        return Records[i]; 
    }
}
 }
Run Code Online (Sandbox Code Playgroud)

谢谢.

tem*_*def 5

你的代码是在正确的轨道上 - 你有正确的功能签名 - 但你的逻辑有点缺陷.特别是,假设您在没有找到要查找的密钥的情况下完成此循环:

for (int i = 0; i < used; ++i)
{
    if (Records[i].Key == _Key)
    {
        return Records[i]; 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果发生这种情况,您的函数不会返回值,从而导致未定义的行为.由于它返回了一个引用,这可能会导致你尝试使用引用的第二个令人讨厌的崩溃.

要解决此问题,您需要添加一些行为以确保不会脱离函数的末尾.一种选择是将密钥添加到表中,然后返回对该新表条目的引用.这是STL std::mapoperator[]函数的行为.另一种情况是抛出一个异常,说密钥不在那里,这确实有一点点违反直觉的缺点.

在完全不相关的说明中,我应该指出,从技术上讲,您不应该将参数命名为此函数_Key.C++标准规定,任何以两个下划线(即__myFunction)开头的标识符名称,或单个下划线后跟大写字母(如您的_Key示例中)都由实现保留,用于他们认为必要的任何目的.他们可以#define将标识符用于无意义的事物,或者将其映射到某些编译器内在函数.如果您从一个平台移动到另一个平台,这可能会导致您的程序停止编译.要解决此问题,请使用K小写(_key)或完全删除下划线(Key).

希望这可以帮助!