创建一个类索引器operator []允许字符串参数(字符串索引)

时间:2010-11-27 21:48:24

标签: c++ string indexing operator-overloading

我想用c ++创建一个类。此类必须使用集合进行管理。 好的,没问题,我当然想使用operator [],但在这种情况下,我希望不是按位置索引,而是按名称索引==>这意味着使用字符串索引器。

似乎这种东西对我的编译器来说并不那么好:

// In hpp
class myclass {
   ...
   ...
   std::string operator[](const std::string& name);
}
// In cpp
std::string myclass::operator[](const std::string& name) {
   ...
}
// In main
myclass m;
std::string value = m["Name"];

编译器告诉我他无法解决这个问题,因为operator [const char [5]]不存在。 好的好的 我能算出来...... 编译器认为通过调用m [“Name”]我试图调用运算符来接受char *而不是字符串... ok 让我们用operator []更改代码,允许char *作为参数......没有。

有人能告诉我如何以最佳实践方式在c ++中实现这样的结果吗?我想这是一个常见的问题,按字符串索引,而不是整数... 谢谢。

2 个答案:

答案 0 :(得分:2)

您提供的代码应该编译正常(假设operatorpublic,您使用class终止;声明。我怀疑编译器错误在其他地方。

就个人而言,我会使用std::map<std::string, std::string>作为容器类。

#include <string>
#include <map>
#include <assert.h>

int main()
{
    std::map<std::string, std::string> m;
    m["Foo"] = "Bar";
    m["Fez"] = "Baz";

    assert(m["Foo"] == "Bar");
    assert(m["Fez"] == "Baz");
}

答案 1 :(得分:1)

应该可以正常工作。请参阅此示例,该示例可编译并对我有效:

#include <iostream>
#include <string>

class MyClass
{
    public:
        std::string operator[] (const std::string& key) { std::cout << key << std::endl; return key; }
};

int main()
{
    MyClass obj;
    std::string s = obj["50"];
    std::cout << s << std::endl;
}

我认为没有理由不应该这样,因为std :: string有隐式构造函数取const char*所以转换应该是自动的。

编辑:从评论看来,你的主要问题似乎是你的问题:

int main()
{
    MyClass obj();
    std::string s = obj["50"];
    std::cout << s << std::endl;
}

原因:

  

一个对象,其初始化程序是一组空的括号,即(),应进行值初始化。

     

[注意:初始化程序的语法

不允许使用()      

X a();

     

不是X类对象的声明,而是声明一个不带参数并返回X的函数。

     

在某些其他初始化上下文中允许使用form()(5.3.4,5.2.3,12.6.2)。 - 结束说明]