【问题标题】:Creating a class indexer operator[] allowing string parameter (string index)创建类索引器运算符 [] 允许字符串参数(字符串索引)
【发布时间】:2010-11-27 21:48:23
【问题描述】:

我想用 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* 而不是字符串的操作员......好的 让我们用 operator[] 更改代码,允许 char* 作为参数......什么都没有。

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

【问题讨论】:

  • 当你尝试std::string value = m[std::string("Name")];时会发生什么
  • 我很确定编译器是一个she
  • @TokenMacGuy,std::string 有一个接受 char* 的 ctor,所以没关系。

标签: c++ string indexing operator-overloading


【解决方案1】:

您提供的代码应该可以正常编译(假设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");
}

【讨论】:

  • 感谢您的帮助...使用地图当然是个好主意...我会考虑的。 :)
【解决方案2】:

它应该可以正常工作。看看这个对我来说编译和工作正常的例子:

#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 的函数的声明。

在某些其他初始化上下文(5.3.4、5.2.3、12.6.2)中允许使用 () 形式。 ——尾注]

【讨论】:

  • 嗯,这真的很奇怪......错误是这样的:“数组下标的无效类型 mynamespace::myclass()[const char[5]]”......我的上帝这是什么意思? ??连“myclass()[const char[5]]”这句话都很奇怪……它指的是什么?我的是一个普通类,它有一个 public operator[] 返回一个 std::string 并将一个 const std::string& 作为参数...当我在执行此操作的行上使用此运算符时,我的编译器给了我一个错误:myclassinstance [“值”]。如果编译并注释该行,所有类都会编译...
  • 你的 int main() 是否包含这样的东西?我的类 obj();这样你会得到你描述的“数组下标的类型无效”错误。
  • 我不敢相信......没有注意到这么简单的事情......好吧,Plamik你是个天才,你怎么能猜到???????非常感谢.... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 2016-02-11
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多